从另一个召唤一个sp

时间:2013-06-01 21:52:17

标签: tsql stored-procedures sql-server-2012-express

在此链接

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

我们可以找到一个可以比较两个表数据的存储过程示例。我想要的是为数据库中的每个表调用此sp。我找到了将在所有表中枚举的下一个sp

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

问题是我无法正确传递参数。这是我尝试过的(我已将两个数据库都放在本地服务器上):

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

并且

失败

Msg 102,Level 15,State 1,Line 1'[dbo]附近的语法不正确。[活动]。

每张桌子都有相同的信息。任何人都可以帮我解决我在这里做错的事吗?

1 个答案:

答案 0 :(得分: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, '?'"
    
  3. 注意:对于只有“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 '''+@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调用它应该是这样)。也是一个跳过sysdiagrams的调整,它在我的系统上被选中(SQL Server 2008 Express)。

    用法是

    sp_MSforeachtable "EXEC uspCompareTable dbname1, dbname2, '?'"