SQL Server - 检索数据库中每个表的最后一条记录

时间:2012-02-27 18:30:25

标签: sql sql-server sql-server-2008

我正在寻找在数据库的每个表中输入的最后一条记录。我知道如何一次一个地返回每个表的最后一条记录。但是,我需要遍历所有表(大约10,000)并找到最后发布的记录。我可以通过脚本执行此操作(即将所有表放入一个数组中,然后为每个表执行一次)。

除了从表查询中获取最后一篇文章并使用系统表之外,还有其他方法吗?例如,我可以使用“SELECT name FROM Sys.tables”获取所有表名,将其放入数组中,然后使用foreach循环获取最后一条消息“SELECT TOP 1 date FROM table_A ORDER BY date DESC”。

我希望在上次更新表时系统表中有一个字段。我不想为每个查询编写脚本,我宁愿运行SQL查询。我还没有找到这样的。

这是我能做的(不是实际的语法)但是我想在不查询表的情况下使用SQL查询 - 这可能吗?

Array = "SELECT name Sys.tables"
foreach item in Array execute "SELECT TOP 1 date FROM item ORDER BY date DESC"

5 个答案:

答案 0 :(得分:3)

您可以使用 sp_MSforeachtable 存储过程对数据库中的所有表执行查询。

例如,exec sp_MSforeachtable 'select top 1 * from ?'

答案 1 :(得分:0)

上次更新桌子时,有内置的方式:http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/

请注意,如果重新启动SQL Server,则这不可靠。 DMV被清除,因此它可能看起来像一个从未被访问过的表,实际上它可能在重启前5分钟被访问过。 Aaron Bertrand对这一事实发表了评论并在此发表了博客:

或者,如果您需要事务一致的答案,则可以遍历所有表名并为所有表发出查询。这似乎是一种可行的方法。

答案 2 :(得分:0)

您需要设置更改数据捕获或使用LastUpdate类型列才能可靠地获取此数据。

对主键的任何类型的查询都不起作用,因为主键按照该数据类型的升序或降序排序,而不是基于插入记录的时间。

答案 3 :(得分:0)

我有一种丑陋的方式来做你想要的事情(如果你希望你的结果在单个查询中sp_MSforeachtable不起作用)...它会在我的数据库上永远处理,因为日期没有被编入索引但它应该工作

DECLARE @Req AS NVARCHAR(MAX)
SET @Req = (SELECT LEFT(ids,LEN(ids) - 6) 
           FROM
           (SELECT 'SELECT (SELECT Top 1 date FROM ' + t.name + ' ORDER BY date DESC) UNION ' 
            FROM Sys.tables t 
            INNER JOIN Sys.columns c ON t.object_id = c.object_id
                AND c.name = 'date'
            WHERE t.schema_id = 1
            FOR XML PATH('')) a(ids)
           WHERE ids IS NOT NULL
             AND LEN(ids) > 7)
EXEC(@Req)

答案 4 :(得分:0)

string query = "Select * from table";

SqlDataAdapter da = new SqlDataAdapter(query, con); // con is connection 

ds = new DataSet();
da.Fill(ds);

int last = Convert.ToInt32(ds.Tables[0].Rows.Count);

string id = ds.Tables[0].Rows[last-1]["State"].ToString();

textBox1.Text = id;