【问题标题】:Return Latest Row DateTime For All Tables in a SQL Server Database返回 SQL Server 数据库中所有表的最新行日期时间
【发布时间】:2016-10-16 18:25:41
【问题描述】:

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

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

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

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

任何帮助将不胜感激!

谢谢。

【问题讨论】:

    标签: sql sql-server datetime qa ssms-2016


    【解决方案1】:

    是的,你可以这样做:

    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 解决方案。

    【讨论】:

    • 我确信第一个在较小的数据库上效果很好,但在我使用的数据库上似乎永远需要。
    • 第二个似乎在我的 13.5 行之后被删掉了,考虑到 nvarchar(max) 的大小,这有点傻。我唯一关心的是这个概念是否需要执行整个数据库扫描。在我的情况下,这将使它完全无用。
    • @DataMan31 由于PRINT,您得到13,5 行,尝试在select @sql(<here to select>) 之间选择一个部分并运行它。你会看到所有的线都在他们的位置上。
    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 2014-01-05
    • 2017-08-04
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多