Return SQL 服务器数据库中所有表的最新行日期时间
Return Latest Row DateTime For All Tables in a SQL Server Database
我有一个数据库 [database1]
,里面有数千个 table。每个Table里面都有一个Row Insert Update Date/Time Column [EventDateTime]
,不一定是主键。
我希望创建一个查询来创建一个包含两列的临时 table(或打印视图); [TableName]
& [LatestEventDateTime]
.
我想我可以使用 sp_MSforeachtable
来检索数据,但我不确定如何为每个 table.[=18= 调用 max [EventDateTime]
]
这些将是一个很好的验证查询,用于确认每个 table 正在更新。
是的,你可以这样做:
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 解决方案。
我有一个数据库 [database1]
,里面有数千个 table。每个Table里面都有一个Row Insert Update Date/Time Column [EventDateTime]
,不一定是主键。
我希望创建一个查询来创建一个包含两列的临时 table(或打印视图); [TableName]
& [LatestEventDateTime]
.
我想我可以使用 sp_MSforeachtable
来检索数据,但我不确定如何为每个 table.[=18= 调用 max [EventDateTime]
]
这些将是一个很好的验证查询,用于确认每个 table 正在更新。
是的,你可以这样做:
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 解决方案。