我會堅持我的脖子出來,張貼這個答案,因爲它沒有格式化很好的評論。 你試過這樣:
sp_MSforeachtable "EXEC sp_CompareTable dbName1, dbName2, NULL, PARSENAME('[?]', 1)"
更新:
看起來它不喜歡的PARSENAME。你可以試試這個(我在一個版本的sp_CompareTable上試着用EXEC改成PRINT)。
添加此行sp_CompareTable(在EXEC前):
SET @TableName = PARSENAME(@TableName,1)
這樣稱呼它:
sp_MSforeachtable "EXEC sp_CompareTable dbName1, dbName2, dbo, '?'"
注:這將是一個快速解決你只有「dbo」模式的情況。它並沒有真正回答爲什麼原始語法不起作用的問題。
再次更新:
這裏是它適合與sp_MSforeachtable
CREATE PROC [dbo].[uspCompareTable](@db1 varchar(250), @db2 sysname, @TableName sysname)
AS
declare @reason varchar(7)='Missing';
IF @TableName = '[dbo].[sysdiagrams]'
RETURN
IF CHARINDEX('.',@db1,1) <> 0
SET @db1=QUOTENAME(SUBSTRING(@db1,1, CHARINDEX('.',@db1,1)-1))+'.'+QUOTENAME(SUBSTRING(@db1, CHARINDEX('.',@db1,1)+1,DATALENGTH(@db1)-CHARINDEX('.',@db1,1)))
IF CHARINDEX('.',@db2,1) <> 0
SET @db2=QUOTENAME(SUBSTRING(@db2,1, CHARINDEX('.',@db2,1)-1))+'.'+QUOTENAME(SUBSTRING(@db2, CHARINDEX('.',@db2,1)+1,DATALENGTH(@db2)-CHARINDEX('.',@db2,1)))
EXEC ('
SELECT * FROM
(SELECT * FROM '+ @db1 + '.' + @TableName +'
EXCEPT
SELECT * FROM '+ @db2 + '.' + @TableName +') T
CROSS JOIN (SELECT '''[email protected] +' in '[email protected] +'.' + @TableName+''' Reason) T2
UNION ALL
SELECT * FROM
(SELECT * FROM '+ @db2 + '.' + @TableName +'
EXCEPT
SELECT * FROM '+ @db1 + '.' + @TableName +') T
CROSS JOIN (SELECT ''' + @reason + ' in ' + @db1 + '.' + @TableName + ''' Reason) T2')
在這裏,我假設的模式將是表名的一部分運行的比較表的存儲過程的一個版本(其應該是如果你從sp_MSforeachtable調用)。還可以跳過sysdiagrams的調整,這個調整會在我的系統(SQL Server 2008 Express)中被獲取。
用法是
sp_MSforeachtable "EXEC uspCompareTable dbname1, dbname2, '?'"
這從你的鏈接:「我們當然可以,創建一個使用遊標來遍歷所有數據庫中的表通過動態SQL,供我驅策的腳本。 Yuck!「 - 這將是我的建議:使用光標並省略這個magick無證的東西。此致 – Enno