使用Tablediff比较所有表

7

我最近发现了SQL Server 2005的tablediff实用工具。

我有两个相同数据库实例,分别在不同的服务器上。

是否可以使用tablediff比较所有表格,而无需复制相同的命令,只需更改表名即可?

例如,将server1上的table1与server2上的table1进行比较,然后将server1上的table2与server2上的table2进行比较,直到所有表格都被比较为止。

3个回答

10
这可以通过将tablediff实用程序的-sourceserver选项设置为第一个服务器,将-destinationserver选项设置为第二个服务器来完成。您可以使用sys.Tables遍历数据库中的每个表,以便自动化此过程。
编辑:
我还想指出这篇文章,它是一段聪明的t-sql代码,可能更适合您,而不需要tablediff的复杂性。
根据您的评论,这是一个示例。虽然这不是在生产环境中执行此操作的最佳方式,但它应该能够为您完成工作。如果您需要更适合生产的选项,则最好在SSIS中实现此选项。
SET QUOTED_IDENTIFIER ON 

DECLARE @TableNames as table (
    id int identity(1,1),
    tableName varchar(100))

DECLARE @sTableDiff nvarchar(1000)
DECLARE @tableName varchar(100)
DECLARE @counter int
DECLARE @maxCount int

INSERT INTo @TableNames 
SELECT name 
FROM sysobjects WHERE type = 'U'

SET @counter = 1

SELECT @maxCount = COUNT(name) 
FROM sysobjects WHERE type = 'U'

WHILE @counter < @maxCount
    Begin
        SELECT @tableName = tableName 
        FROM @TableNames 
        WHERE id = @counter

        SET @sTableDiff= ' "C:\Program Files\Microsoft SQL Server\90\COM\tablediff" -sourceserver Server1 
            -sourceuser sa -sourcepassword password -sourcedatabase YourDatabase -sourcetable ' + @tableName + ' 
            -destinationserver Server2 -destinationuser sa -destinationpassword password -destinationdatabase 
            YourDatabase -destinationtable ' + @tableName + '  -f c:\Diff'      

        EXEC XP_CMDSHELL @sTableDiff

        Set @counter = @counter + 1
    End

你能提供一个例子吗?谢谢! - Davie
当我运行这个 SQL 脚本时,tablediff 报错说无法连接到数据库。然而,当我在 DOS 提示符中运行完全相同的查询时,它可以正常工作,即 tablediff 报告这两个表是相同的!有任何想法吗? - Davie
我不确定,这是一个我已经使用过很多次的脚本,所以我知道它是有效的。如果你在脚本中添加Print @sTableDiff,然后在命令提示符中执行输出,那么会起作用吗? - Irwin M. Fletcher
对于链接文章http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx以及其中展示的优雅比较查询,给予+1和“顶起!”的支持。 - Christian Severin

1

0

你可以使用这个选项来运行脚本文件中的 SQL 语句并进行比较吗?我可能错了,只是一个想法。

-bf number_of_statements


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接