SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Datumswert in der Datenbank

Unbeantwortet Dieser Beitrag hat 5 Antworten

Ohne Rang
81 Beiträge
Dirk Weinert erstellt 9 Jan. 2014 12:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallöle,
frohes Neues erst einmal :-)

Auf meinem SharePoint 2010 habe ich eine Liste angelegt.
An diese ist ein Inhaltstyp gehängt, der ein paar Spalten
enthält.
Standardmäßig gibt es ja z.B. Created, Modified usw.

Zusätzlich habe ich eine Spalte vom Typ Date and Time,
wobei aber nur das Datum angezeigt wird.
Sobald ich der Liste ein neues Item hinzufüge wird mein
Datumsfeld mit einem Wert (Today plus einer Zahl) gefüllt.

Bis hier alles kein Problem.

Da ich per Script den Datumswert (z.B. 15.04.2016) haben
möchte, muss ich natürlich wissen, wo in der SharePoint-DB
der Wert eingetragen wurde.

Genau hier habe ich ein interessantes Phänomen festgestellt.

Auf dem SQL-Server finde ich in den jeweiligen Tabellen
den Namen der Liste sowie die Inhalte der ausgefüllten Felder.

Das einzige Feld, dass ich nicht finde, ist mein Datumsfeld.
Genauer gesagt, ich finde die Spaltenbezeichnung aber nicht den Wert.

Ich durchsuche mit einer stored procedure alle Tabellen des
SQL-Servers nach einem Suchstring.
Gebe ich als Suchstring z.B. den Namen der Liste an, so werden
mir die entsprechenden Datensätze ausgegeben.

Wie gesagt, den Wert des Datumsfeldes (15.04.2016) findet er aber nicht.

Woran könnte das liegen?
Wird das Datum vielleicht in einen Timestamp umgewandelt?

Ach so, hier noch das Suchskript.
Es stammt von:
http://gallery.technet.microsoft.com/scriptcenter/c0c57332-8624-48c0-b4c3-5b31fe641c58

 IF OBJECT_ID('SP_SearchTables','P') IS NOT NULL
    DROP PROCEDURE SP_SearchTables
GO
CREATE PROCEDURE SP_SearchTables
 @Tablenames VARCHAR(500)
,@SearchStr NVARCHAR(60)
,@GenerateSQLOnly Bit = 0
AS
 
/*
    Parameters and usage
 
    @Tablenames        -- Provide a single table name or multiple table name with comma seperated. 
                        If left blank , it will check for all the tables in the database
    @SearchStr        -- Provide the search string. Use the '%' to coin the search. 
                        EX : X%--- will give data staring with X
                             %X--- will give data ending with X
                             %X%--- will give data containig  X
    @GenerateSQLOnly -- Provide 1 if you only want to generate the SQL statements without seraching the database. 
                        By default it is 0 and it will search.
 
    Samples :
 
    1. To search data in a table
 
        EXEC SP_SearchTables @Tablenames = 'T1'
                         ,@SearchStr  = '%TEST%'
 
        The above sample searches in table T1 with string containing TEST.
 
    2. To search in a multiple table
 
        EXEC SP_SearchTables @Tablenames = 'T2'
                         ,@SearchStr  = '%TEST%'
 
        The above sample searches in tables T1 & T2 with string containing TEST.
    
    3. To search in a all table
 
        EXEC SP_SearchTables @Tablenames = '%'
                         ,@SearchStr  = '%TEST%'
 
        The above sample searches in all table with string containing TEST.
 
    4. Generate the SQL for the Select statements
 
        EXEC SP_SearchTables @Tablenames        = 'T1'
                         ,@SearchStr        = '%TEST%'
                         ,@GenerateSQLOnly    = 1
 
*/
 
    SET NOCOUNT ON
 
    DECLARE @MatchFound BIT
 
    SELECT @MatchFound = 0
 
    DECLARE @CheckTableNames Table
    (
    Tablename sysname
    )
 
    DECLARE @SQLTbl TABLE
    (
     Tablename        SYSNAME
    ,WHEREClause    VARCHAR(MAX)
    ,SQLStatement   VARCHAR(MAX)
    ,Execstatus        BIT 
    )
 
    DECLARE @sql VARCHAR(MAX)
    DECLARE @tmpTblname sysname
    DECLARE @ErrMsg VARCHAR(100)
 
    IF LTRIM(RTRIM(@Tablenames)) IN ('' ,'%')
    BEGIN
 
        INSERT INTO @CheckTableNames
        SELECT Name
          FROM sys.tables
    END
    ELSE
    BEGIN
 
        SELECT @sql = 'SELECT ''' + REPLACE(@Tablenames,',',''' UNION SELECT ''') + ''''
 
        INSERT INTO @CheckTableNames
        EXEC(@sql)
 
    END
 
    IF NOT EXISTS(SELECT 1 FROM @CheckTableNames)
    BEGIN
        
        SELECT @ErrMsg = 'No tables are found in this database ' + DB_NAME() + ' for the specified filter'
        PRINT @ErrMsg
        RETURN
 
    END
    
    INSERT INTO @SQLTbl
    ( Tablename,WHEREClause)
    SELECT QUOTENAME(SCh.name) + '.' + QUOTENAME(ST.NAME),
            (
                SELECT '[' + SC.name + ']' + ' LIKE ''' + @SearchStr + ''' OR ' + CHAR(10)
                  FROM SYS.columns SC
                  JOIN SYS.types STy
                    ON STy.system_type_id = SC.system_type_id
                   AND STy.user_type_id =SC.user_type_id
                 WHERE STY.name in ('varchar','char','nvarchar','nchar')
                   AND SC.object_id = ST.object_id
                 ORDER BY SC.name
                FOR XML PATH('')
            )
      FROM  SYS.tables ST
      JOIN @CheckTableNames chktbls
                ON chktbls.Tablename = ST.name 
      JOIN SYS.schemas SCh
        ON ST.schema_id = SCh.schema_id
     WHERE ST.name <> 'SearchTMP'
      GROUP BY ST.object_id, QUOTENAME(SCh.name) + '.' +  QUOTENAME(ST.NAME) ;
    
 
      UPDATE @SQLTbl
         SET SQLStatement = 'SELECT * INTO SearchTMP FROM ' + Tablename + ' WHERE ' + substring(WHEREClause,1,len(WHEREClause)-5)
 
      DELETE FROM @SQLTbl
       WHERE WHEREClause IS NULL
    
    WHILE EXISTS (SELECT 1 FROM @SQLTbl WHERE ISNULL(Execstatus ,0) = 0)
    BEGIN
 
        SELECT TOP 1 @tmpTblname = Tablename , @sql = SQLStatement
          FROM @SQLTbl 
         WHERE ISNULL(Execstatus ,0) = 0
 
         IF @GenerateSQLOnly = 0
         BEGIN
 
            IF OBJECT_ID('SearchTMP','U') IS NOT NULL
                DROP TABLE SearchTMP
            EXEC (@SQL)
 
            IF EXISTS(SELECT 1 FROM SearchTMP)
            BEGIN
                SELECT Tablename=@tmpTblname,* FROM SearchTMP
                SELECT @MatchFound = 1
            END
 
         END
         ELSE
         BEGIN
             PRINT REPLICATE('-',100)
             PRINT @tmpTblname
             PRINT REPLICATE('-',100)
             PRINT replace(@sql,'INTO SearchTMP','')
         END
 
         UPDATE @SQLTbl
            SET Execstatus = 1
          WHERE Tablename = @tmpTblname
 
    END
 
    IF @MatchFound = 0 
    BEGIN
        SELECT @ErrMsg = 'No Matches are found in this database ' + DB_NAME() + ' for the specified filter'
        PRINT @ErrMsg
        RETURN
    END
    
    SET NOCOUNT OFF
 
go

Wenn ich z.B. nur nach der Jahreszahl suche, sieht der Aufruf wie folgt aus:

 EXEC SP_SearchTables @Tablenames = '%' ,@SearchStr  = '%2015%'

Danke
Dirk

 

Alle Antworten

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 9 Jan. 2014 13:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Dirk,

warum willst du wissen wo es in der DB steht, SharePoint hat eine API die man benutzen sollte um an Informationen zukommen (Server Object Model, Client Object Model und WebServices). Dein Script für die Stored Procedure benötigst du auch nicht wirklich, da alle Informationen weitestgehend in eine Tabelle gespeichert werden AllUserData. Anpassungen in der DB sollten nicht vorgenommen werden.

Ohne Rang
81 Beiträge
Dirk Weinert Als Antwort am 9 Jan. 2014 14:20
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Thomas,

es geht mir nicht um Änderungen an der Datenbank.
Ich werde mich hüten, die Einträge dort direkt zu ändern. :-)

Mein Vorgesetzter denkt über die Weiterverarbeitung
verschiedener Daten auf anderen Systemen nach.

Er wollte wissen, ob man sich scriptgesteuert die Daten
aus der DB herausholen kann.
Wie gesagt, es geht nicht um die Manipulation der Daten.

Wir haben u. a. eine Projektmanagement-Lösung, die auf
SharePoint 2010 basiert. Dort lasse ich mir z. B. auch
regelmäßig scriptgesteuert die Anzahl der Projekt, sowie die
damit verbundene Speicherbelegung anzeigen.

Da ist so ein Script doch schon recht elegant.

Danke
Dirk

 

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 9 Jan. 2014 14:33
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Dirk,

ja auch das kann man u.a. mit der Powershell auf dem SP Server scripten. Du kannst zu dem Feld (XML) über das Attribute "ColName" z.B. mit dem SharePoint Manager oder mit der PS nachschauen welches Spalte in der AllUserData Tabelle benutzt wird.

Ohne Rang
634 Beiträge
Olaf Didszun Als Antwort am 9 Jan. 2014 22:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der direkte Zugriff auf eine der diversen SharePoint-Datenbanken wird von Microsoft nicht supported! Hauptsächliche Argumentation: es können dadurch u.a. Locks entstehen, die den ordnungsgemäßen Zugriff durch SharePoint selbst beeinträchtigen und zu unerwarteten Problemen führen.

Wenn Ihr irgendetwas mit den Daten direkt auf SQL Server Ebene machen wollt, dann zieht sie über das Objektmodell heraus und schreibt sie in eine andere Datenbank. Alternative ist der Zugriff mit einem PowerShell-Script, wobei dabei auch das SharePoint Object Model zum Einsatz kommt.

Eine Alternative kann sein, ein Backup der Datenbank unter einem anderen Namen wiederherzustellen. Damit gehört die Datenbank zunächst nicht mehr zur SharePoint-Farm und ihr könnt damit machen, was ihr wollt.

Beste Grüße

Olaf

 

Ohne Rang
81 Beiträge
Dirk Weinert Als Antwort am 10 Jan. 2014 08:41
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

ich habe mich nun auch für ein PowerShell Script entschieden.
Erst wollte ich ja per SQL an die Daten ran.

Es geht hier in der Tat nur um das Auslesen der Daten.
Wenn irgendetwas daran geändert werden sollte, dann
würde ich sie separat wegspeichern (wie schon vorgeschlagen,
z. B. in eine andere DB).
Manipulierte Datensätze schreibe ich ganz gewiss nicht
zurück in die SharePoint Datenbank. :-)

Danke
Dirk