1

このリンクで

http://gallery.technet.microsoft.com/Compare-Data-0c5bfc87#content

2 つのテーブル データを比較できるストアド プロシージャの例を見つけることができます。私が望むのは、データベース内の各テーブルに対してこの 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].[Activities]' 付近の構文が正しくありません。

そして、すべてのテーブルに同じメッセージ。ここで私が間違っていることを手伝ってくれる人はいますか?

4

1 に答える 1

0

コメントとして適切にフォーマットされていないため、首を突き出して回答として投稿します。これを試しましたか:

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

アップデート:

PARSENAMEが気に入らないようです。これを試すことができます (EXEC を PRINT に変更したバージョンの sp_CompareTable でこれを試しました)。

  1. 次の行を sp_CompareTable に追加します (EXEC の前):

    SET @TableName = PARSENAME(@TableName,1)
    
  2. 次のように呼び出します。

    sp_MSforeachtable "EXEC sp_CompareTable dbName1, dbName2,  dbo, '?'"
    

注意: これは、「dbo」スキーマしかない場合の簡単な修正になります。なぜ元の構文が機能しないのかという質問には、実際には答えていません。

再度更新:

sp_MSforeachtable で実行するように調整された Compare Table ストアド プロシージャのバージョンを次に示します。

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 '''+@reason +' in '+@db2 +'.' + @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') 

ここでは、スキーマが TableName の一部になると想定しています (sp_MSforeachtable から呼び出している場合はそうあるべきです)。また、私のシステム (SQL Server 2008 Express) で取得される sysdiagrams をスキップするための微調整。

使用法は

sp_MSforeachtable "EXEC uspCompareTable dbname1, dbname2, '?'"
于 2013-06-01T23:54:37.190 に答える