コメントとして適切にフォーマットされていないため、首を突き出して回答として投稿します。これを試しましたか:
sp_MSforeachtable "EXEC sp_CompareTable dbName1, dbName2, NULL, PARSENAME('[?]', 1)"
アップデート:
PARSENAMEが気に入らないようです。これを試すことができます (EXEC を PRINT に変更したバージョンの sp_CompareTable でこれを試しました)。
次の行を sp_CompareTable に追加します (EXEC の前):
SET @TableName = PARSENAME(@TableName,1)
次のように呼び出します。
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, '?'"