2013-06-01 87 views
1

一個SP在這個環節調用從另一個

,我們可以找到一個存儲過程例子可以比較兩個表中的數據。我希望將這個sp稱爲數據庫中的每個表。我發現下一個SP將通過所有表

http://weblogs.sqlteam.com/joew/archive/2007/10/23/60383.aspx

的問題是,我不能得到正確傳遞參數枚舉。以下是我試過(我已經把本地服務器上的兩個數據庫):

Exec sp_MSforeachtable "EXEC sp_CompareTable dbName1, dbName2, NULL, PARSENAME('?', 1)" 

和失敗

消息102,級別15,狀態1,行1附近有語法錯誤[DBO]。 [活動]」。

而且每個表的消息都是一樣的。任何人都可以幫助我在這裏做錯了嗎?

+1

這從你的鏈接:「我們當然可以,創建一個使用遊標來遍歷所有數據庫中的表通過動態SQL,供我驅策的腳本。 Yuck!「 - 這將是我的建議:使用光標並省略這個magick無證的東西。此致 – Enno

回答

0

我會堅持我的脖子出來,張貼這個答案,因爲它沒有格式化很好的評論。 你試過這樣:

sp_MSforeachtable "EXEC sp_CompareTable dbName1, dbName2, NULL, PARSENAME('[?]', 1)" 

更新:

看起來它不喜歡的PARSENAME。你可以試試這個(我在一個版本的sp_CompareTable上試着用EXEC改成PRINT)。

  1. 添加此行sp_CompareTable(在EXEC前):

    SET @TableName = PARSENAME(@TableName,1) 
    
  2. 這樣稱呼它:

    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, '?'" 
+0

'[[dbo]]。[Activities]]]'附近的語法不正確。結果只是更多的括號 – Goran

+0

如果你只有「dbo」,你可以嘗試我的快速修復(上面更新)。 – Fruitbat

+0

與問題無關,但也許值得一提。您不應該在存儲過程中真正使用前綴「sp_」。我懷疑對此的一個適當的修復將涉及重寫sp_CompareTable(我可能會在稍後看),在這種情況下,它也應該重命名。 – Fruitbat