2016-10-31 98 views
1

我想在這裏實現的是從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
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'' 
' 
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,此對象沒有記錄,並且不支持由Microso英尺嘗試使用Loop或Cursor來替換您的代碼(因爲可以考慮數據庫的數量,所以不應該出現問題)。