我想在这里实现的是从CheckSum_Agg(Binary_CheckSum(*))
获取结果并将其写入匹配TABLE_NAME
的表格。
下面的查询是我提出的,但它缺少将查询结果写入表格的下一步。
DROP TABLE HashTable
CREATE TABLE HashTable
(
HashTable nvarchar (255),
TABLE_NAME nvarchar (255)
)
INSERT HashTable
EXEC master..sp_MSForeachdb 'USE [?]
IF DB_ID(''?'') > 4
SELECT ''SELECT CheckSum_Agg(Binary_CheckSum(*)) AS HashTable FROM '' + TABLE_CATALOG + ''.'' + ''dbo'' + ''.'' + TABLE_NAME AS HashTable
,TABLE_NAME AS TABLE_NAME
FROM ?.INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = ''BASE TABLE''
'
更新了问题,因为我认为我不够清楚。
我现在得到的结果是:
SELECT CheckSum_Agg(Binary_CheckSum(*)) AS HashTable FROM DatabaseX.dbo.tblX
。
理想的结果是校验和值本身,如1971451
。
谢谢,
答案 0 :(得分:0)
IF EXISTS(SELECT 1 FROM sys.objects WHERE type = 'U' and name = 'testHashTable')
DROP TABLE testHashTable
CREATE TABLE testHashTable
(
HashTable nvarchar (255),
TABLE_NAME nvarchar (255)
)
GO
INSERT INTO testHashTable
EXEC master..sp_MSForeachdb 'USE [?]
IF DB_ID(''?'') > 4
SELECT ''SELECT CheckSum_Agg(Binary_CheckSum(*)) AS HashTable FROM '' + TABLE_CATALOG + ''.'' + ''dbo'' + ''.'' + TABLE_NAME AS HashTable
,TABLE_NAME AS TABLE_NAME
FROM ?.INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = ''BASE TABLE''
'
答案 1 :(得分:0)
您可以使用以下方式:
INSERT INTO testHashTable
EXEC master..sp_MSForeachdb 'USE [?]
.....
OR
EXEC master..sp_MSForeachdb 'USE [?]
IF DB_ID(''?'') > 4
INSERT INTO master.dbo.testHashTable
...
..
但是,如果您计划长期使用此代码,那么避免使用sp_MSForeachdb ,则此对象不会记录,也不受Microsoft支持。尝试使用循环或光标替换您的代码(不应该有问题,因为可以考虑数据库的数量。)。