Anzeigen von abgeschnittenen Tabellen aus allen databaseen auf SQL server 2012

Ich arbeite an einem Projekt, das sich auf abgeschnittene Tabellen in einem server konzentriert. Ziel des Projektes ist es, alle abgeschnittenen Tabellen in der Audit-Tabelle aufzuzeichnen. Ich habe an einem Code unten gearbeitet, der auf einer einzigen database gut funktioniert Allerdings bin ich nicht in der Lage, diesen Code automatisch auf allen databaseen auszuführen. Ich habe versucht zu schreiben:

  1. Mauszeiger
  2. Verwenden von Exec ('Use ' + @DatabaseName + ';') in der gespeicherten Prozedur.
  3. Exec sp_MSforeachDB und die gespeicherte Prozedur.

Jedes Mal, wenn ich versuche, den Sproc für alle databaseen auszuführen, wird es auf einer database ausgeführt, in der der Code existiert. Wie kann ich es auf allen databaseen ausführen?

Hauptabfrage:

 DBCC TRACEON (2537) -- All Log Files ;WITH TranCte as ( SELECT [Transaction Id] ,[Transaction Name] ,[Begin Time] ,SUSER_SNAME( [Transaction SID]) AS [User] ,[Operation] FROM fn_dblog (NULL, NULL) WHERE [Transaction Name] = 'TRUNCATE TABLE'), ObjectCte AS (SELECT [Lock Information] ,[Transaction Name] ,[Transaction Id] FROM fn_dblog (NULL, NULL) WHERE [Transaction Id] IN (SELECT [Transaction Id] FROM fn_dblog(NULL, NULL) WHERE [Transaction Name] = 'TRUNCATE TABLE' ) AND [Lock Information] LIKE '%SCH_M OBJECT%'), ConvertStringToRows ( [Lock Information], starts, pos, [Transaction ID]) AS (SELECT [Lock Information] ,1 ,CHARINDEX( ':', [Lock Information]) ,[Transaction ID] FROM ObjectCte UNION ALL SELECT [Lock Information] ,pos + 1 ,CHARINDEX( ':', [Lock Information], pos + 1) ,[Transaction ID] FROM ConvertStringToRows WHERE pos > 0 ), ConvertStringToRowsDetails AS (SELECT * ,RowN = ROW_NUMBER () OVER (PARTITION BY [Lock Information] , [Transaction ID] ORDER BY Starts , [Transaction ID] ) ,ColumnType = CASE ROW_NUMBER () OVER (PARTITION BY [Lock Information], [Transaction ID] ORDER BY Starts , [Transaction ID] ) WHEN 3 THEN 'Database' WHEN 4 THEN 'Object' END ,DetailsID = SUBSTRING ([Lock Information], starts, CASE WHEN pos > 0 THEN pos - starts ELSE LEN ([Lock Information]) END) FROM ConvertStringToRows ) , CTE_Report AS (SELECT e.* ,ObjectID = ob .DetailsID ,DatabaseID = db .DetailsID ,o. [Lock Information] ,TableName = OBJECT_NAME (ob. DetailsID, db.DetailsID ) ,[Database] = DB_NAME (db. DetailsID) FROM TranCte e JOIN ObjectCte o ON e .[Transaction Id] = o .[Transaction Id] JOIN ConvertStringToRowsDetails db ON o .[Lock Information] = db .[Lock Information] AND db .ColumnType = 'Database' JOIN ConvertStringToRowsDetails ob ON o .[Lock Information] = ob .[Lock Information] AND ob .ColumnType = 'Object' ) SELECT * FROM CTE_Report 

Dieser Code wird auf die Systemtabellen für die database, die Sie derzeit in jeder time, so wird nur zeigen, dass die database data.

Wenn du es über databaseen ausführen willst, musst du entweder den Code in jede database stecken und ihn von dort aus mit einer der bereits ausgeführten methods ausführen oder zusammengesetzte viewen und functionen erstellen, die den Code aus einem angegebenen zusammenfassen list der databaseen und lesen von ihnen.

Oder Sie könnten alle diese Code in dynamische SQL und EXEC es gegen eine bestimmte database in Ihrem Sproc setzen. Aber das würde ich wirklich nicht machen.

EDIT – Kommentar ist richtig. Ignoriere mein früheres Vorurteil. Ist das dynamische SQL-Ding. Einer der wenigen SO Fragen, wo es die richtige Antwort ist.