Sql 如何显示数据库中所有表的最后100行
假设我有一个包含N个表(30-50)的数据库,其中包含不同的数据。所有表都有列“CreatedDate” 所以,我想根据这个日期从数据库中为所有表选择最后100条记录,以便进行日志/审计 一种方法是手动对所有表执行Sql 如何显示数据库中所有表的最后100行,sql,sql-server,Sql,Sql Server,假设我有一个包含N个表(30-50)的数据库,其中包含不同的数据。所有表都有列“CreatedDate” 所以,我想根据这个日期从数据库中为所有表选择最后100条记录,以便进行日志/审计 一种方法是手动对所有表执行union all。或者将存储过程与系统表一起使用 但我认为有更好的方法可以查看插入SQLServer的所有记录的方便列表 也许还有一个内置的或第三方的工具 像这样的。。。。。。 您必须将您的日期条件添加到 DECLARE @dt DateTime = GetDate() DECLAR
union all
。或者将存储过程与系统表一起使用
但我认为有更好的方法可以查看插入SQLServer的所有记录的方便列表
也许还有一个内置的或第三方的工具 像这样的。。。。。。
您必须将您的日期条件添加到
DECLARE @dt DateTime = GetDate()
DECLARE @sqlCommand NVARCHAR(100);
DECLARE curTbls CURSOR FOR SELECT 'SELECT TOP 100 * FROM ' + name
FROM Sys.tables;
OPEN curTbls
FETCH NEXT FROM curTbls
INTO @sqlCommand;
--SELECT @sqlCommand;
EXECUTE sp_executesql @sqlCommand
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM curTbls
INTO @sqlCommand;
--SELECT @sqlCommand;
EXECUTE sp_executesql @sqlCommand
END;
CLOSE curTbls;
DEALLOCATE curTbls;
您可以使用动态SQL。。。希望这有帮助
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'
SELECT TOP (100) *
FROM ' + QUOTENAME(SCHEMA_NAME([schema_id]))
+ '.' + QUOTENAME(name)
+ '
ORDER BY CreatedDate DESC'';'
FROM sys.tables AS t;
PRINT @sql;
EXEC sp_executesql @sql;
或
环绕动态SQL,这将对您有所帮助
SELECT 'Select Top 100 * From ' + SCHEMA_NAME(schema_id) + '.' + name +'
ORDER BY CreatedOn DESC'
FROM sys.objects
WHERE TYPE = 'U'
或
我猜排名前100的rowas可能只来自其中一张桌子,因此每个桌子排名前100。 但是在下面,我相信您只需要编写函数“FunctionToGetAllColumnsForTableIntoOneBigOne()”,您应该能够使用我提供的另一个链接
DECLARE @dt DateTime = GetDate();
DECLARE @sqlCommand NVARCHAR(MAX);
DECLARE @tmpsqlCommand NVARCHAR(100);
DECLARE curTbls CURSOR FOR SELECT 'SELECT TOP 100 CreatedDate, ' + FunctionToGetAllColumnsForTableIntoOneBigOne(name) as colMain + ' FROM ' + name + ' UNION ALL ' FROM Sys.tables;
OPEN curTbls
FETCH NEXT FROM curTbls
INTO @sqlCommand;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM curTbls
INTO @tmpsqlCommand;
SET @sqlCommand = @sqlCommand + @tmpsqlCommand;
END;
CLOSE curTbls;
DEALLOCATE curTbls;
SET @sqlCommand = @sqlCommand + ' SELECT GetDate(),'
SET @sqlCommand = 'SELECT TOP 100 * FROM ( '+ @sqlCommand + ') sub_q ORDER BY CreatedDate DESC'
--SELECT @sqlCommand
EXECUTE sp_executesql @sqlCommand
祝你好运-我希望这对你有所帮助。我想这是因为桌子设计不太好造成的问题。为什么有那么多的表中有这个列?@jarlh。通常,我在数据库中的所有表中都有一个名为
CreatedOn
的列。我不认为我的设计“不太好”,但是对于联合表来说,它们必须是相似的,至少部分地是这样。你怎么知道要合并哪些列?谢谢你的脚本。但我想从所有表中选择前100条记录。不是每张桌子都有。基本上是数据库中最新的100条记录。哦,我明白了。您可以做的是将每个表的datetime中的所有字段appart连接到一个大的NVARCHAR中。小心空值。将所有语句合并在一起,并将其全部包装在子选择中。然后通过DateColumn DESC从子选择订单中选择top 100;我最初提供的东西和这个的结合应该能让你达到目的。。好的,我知道为什么我刚刚投了反对票。我认为这是解决方案的一个很好的基础。注意,OP需要总共100行(最新的),在30到50个不同的表中找到。
DECLARE @dt DateTime = GetDate();
DECLARE @sqlCommand NVARCHAR(MAX);
DECLARE @tmpsqlCommand NVARCHAR(100);
DECLARE curTbls CURSOR FOR SELECT 'SELECT TOP 100 CreatedDate, ' + FunctionToGetAllColumnsForTableIntoOneBigOne(name) as colMain + ' FROM ' + name + ' UNION ALL ' FROM Sys.tables;
OPEN curTbls
FETCH NEXT FROM curTbls
INTO @sqlCommand;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM curTbls
INTO @tmpsqlCommand;
SET @sqlCommand = @sqlCommand + @tmpsqlCommand;
END;
CLOSE curTbls;
DEALLOCATE curTbls;
SET @sqlCommand = @sqlCommand + ' SELECT GetDate(),'
SET @sqlCommand = 'SELECT TOP 100 * FROM ( '+ @sqlCommand + ') sub_q ORDER BY CreatedDate DESC'
--SELECT @sqlCommand
EXECUTE sp_executesql @sqlCommand