1

[database1]何千ものテーブルを含むデータベースがあります。[EventDateTime]各テーブルには、必ずしも主キーとしてではなく、行挿入更新日時列があります。

2 つの列を含む一時テーブル (または印刷ビュー) を作成するクエリを作成したいと考えていました。[TableName]& [LatestEventDateTime].

sp_MSforeachtableを使用してデータを取得できるのではないかと考えていますが、 max [EventDateTime]for each テーブルを呼び出す方法がわかりません。

これらは、すべてのテーブルが更新されていることを確認するための優れた検証クエリです。

どんな助けでも大歓迎です!

ありがとうございました。

4

1 に答える 1

0

はい、次のようにできます。

USE tempdb

IF OBJECT_ID(N'#temp') IS NOT NULL DROP TABLE #temp

CREATE TABLE #temp (
    TableName nvarchar(max),
    MaxEventDateTime datetime
)

USE YourDatabaseName

INSERT INTO #temp
exec sp_MSforeachtable 'SELECT ''?'', MAX([EventDateTime]) FROM ?'

SELECT *
FROM #temp

注:sp_MSforeachtableは文書化されていないストアド プロシージャであり、重要な生産プロセスで使用することはお勧めしません。

動的 SQL ソリューションをお勧めします。

USE tempdb

IF OBJECT_ID(N'#temp') IS NOT NULL DROP TABLE #temp

CREATE TABLE #temp (
    TableName nvarchar(max),
    MaxEventDateTime INT
)

USE YourDatabaseName

DECLARE @sql nvarchar(max)

SELECT @sql = (
    SELECT 'INSERT INTO #temp SELECT '''+[name]+''', MAX([EventDateTime]) FROM '+QUOTENAME([name])+';'+CHAR(10)
    FROM sys.tables 
    FOR XML PATH('')
)

--PRINT @sql
EXEC sp_executesql @SQL

PRINT @sql次のようなクエリが表示されます。

USE [Test] INSERT INTO #temp SELECT 'TABLE_A', COUNT(*) FROM [TABLE_A];
USE [Test] INSERT INTO #temp SELECT 'TABLE_B', COUNT(*) FROM [TABLE_B];
USE [Test] INSERT INTO #temp SELECT 'TestXml', COUNT(*) FROM [TestXml];
USE [Test] INSERT INTO #temp SELECT 'Clients', COUNT(*) FROM [Clients];

動的 SQL ソリューションを使用することをお勧めします。

于 2016-10-16T18:47:45.750 に答える