从日期字段中获取最新日期,该日期字段对于SQL Server数据库

时间:2015-12-10 11:52:25

标签: sql sql-server

我有一个包含470个表的SQL服务器数据库,这些表中的大多数都有一个具有相同名称的字段,用于标记上次更新的日期,我需要一个查询来获取包含该表的所有表的最新日期值字段,所以查询就像,

表名|最后更新日期

这可能吗?

2 个答案:

答案 0 :(得分:1)

没有简单的方法可以做到这一点。一种方法是:

select max(lastUpdateDate)
from (select lastUpdateDate from t1 union all
      select lastUpdateDate from t2 union all
      . . .
      select lastUpdateDate from t470
     ) t;

您可以构建此查询。一种简单的方法是执行以下操作:

select replace('       select lastUpdateDate from @table union all',
               @table, @table_name)
from information_schema.columns
where column_name = 'lastUpdateDate';

(您可能需要考虑模式。)然后复制结果并将其格式化为查询。

另一个有用的功能是sp_MSforeachtable。它没有文档,但有很多关于这个主题的文章,例如one。如果某些表缺少列,这可能有点麻烦。

答案 1 :(得分:0)

正如已经说过的那样,没有任何方式;另一个可能是这个但请记住它使用动态sql及其所有优点和缺点。

此外,我建议设置您喜欢的列名,而不是像我一样在所有日期中查找它,如果它总是相同的

DECLARE @ParmDefinition nvarchar(500);
DECLARE @tableName nvarchar(max)
DECLARE @columnName nvarchar(max)
DECLARE @sqlQuery nvarchar(max)
DECLARE @strDate nvarchar(max)
DECLARE @maxDate DateTime
DECLARE @resDate DateTime
DECLARE @resTable nvarchar(max)
SELECT @resDate = '1900-01-01', @resTable = ''
DECLARE curTables CURSOR FOR
SELECT t.name, c.Name
FROM sys.tables t INNER JOIN sys.columns c ON c.object_id = t.object_id
WHERE t.[type] = 'U' AND c.system_type_id = '61'
OPEN curTables
FETCH NEXT FROM curTables INTO @tableName, @columnName
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @ParmDefinition = N'@maxOUT DateTime OUTPUT';
    SET @sqlQuery = N'SELECT @maxOUT = MAX (' + @columnName + ') FROM ' + @tableName;
    exec sp_executesql @sqlQuery,@ParmDefinition, @maxOUT = @strDate OUTPUT;
    SET @maxDate = CONVERT(DATETIME, @strDate, 102)
    IF (@maxDate > @resDate)
        SELECT @resDate = @maxDate, @resTable = @tableName
    FETCH NEXT FROM curTables INTO @tableName, @columnName
END
CLOSE curTables
DEALLOCATE curTables
SELECT @tableName TableName, @resDate LastUpdateDate