Sql 如何显示数据库中所有表的最后100行

Sql 如何显示数据库中所有表的最后100行,sql,sql-server,Sql,Sql Server,假设我有一个包含N个表(30-50)的数据库,其中包含不同的数据。所有表都有列“CreatedDate” 所以,我想根据这个日期从数据库中为所有表选择最后100条记录,以便进行日志/审计 一种方法是手动对所有表执行union all。或者将存储过程与系统表一起使用 但我认为有更好的方法可以查看插入SQLServer的所有记录的方便列表 也许还有一个内置的或第三方的工具 像这样的。。。。。。 您必须将您的日期条件添加到 DECLARE @dt DateTime = GetDate() DECLAR

假设我有一个包含N个表(30-50)的数据库,其中包含不同的数据。所有表都有列“CreatedDate”

所以,我想根据这个日期从数据库中为所有表选择最后100条记录,以便进行日志/审计

一种方法是手动对所有表执行
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