我有一个包含470个表的SQL服务器数据库,这些表中的大多数都有一个具有相同名称的字段,用于标记上次更新的日期,我需要一个查询来获取包含该表的所有表的最新日期值字段,所以查询就像,
表名|最后更新日期
这可能吗?
答案 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