我正在寻找在数据库的每个表中输入的最后一条记录。我知道如何一次一个地返回每个表的最后一条记录。但是,我需要遍历所有表(大约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"
答案 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;