1

我有一个数据库[database1],其中包含数千个表。每个表中都有一个行插入更新日期/时间列[EventDateTime],不一定作为主键。

我希望创建一个查询来创建一个包含两列的临时表(或打印视图);[TableName]& [LatestEventDateTime].

我想我也许可以sp_MSforeachtable用来检索数据,但我不知道如何max [EventDateTime]为每个表调用。

这些将是一个很好的验证查询,可以确认每个表都在更新。

任何帮助,将不胜感激!

谢谢你。

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 回答