在SQL Server中实现对称差异?

时间:2008-09-16 00:52:54

标签: sql sql-server

这是我在工作中一直试图解决的问题。我不是数据库专家,所以也许这有点二年级。所有道歉。

我有一个给定的数据库D,它已经在另一台机器上复制(可能是一种可疑的方式),导致数据库D'。我的任务是检查数据库D和D'实际上完全相同。

当然,问题是,如果不是,那么实际应该做些什么。为此,我的想法是在每个相应的表上运行对称差异并查看差异。

有一个“大”数量的表,所以我不希望手动运行每个对称差异。然后,我如何实现可以在任意表上运行的对称差异“函数”(或存储过程,或任何你想要的),而不必显式枚举列?

这是在Windows上运行的,如果您没有遵循,您的对冲基金将会爆炸。祝你好运。

5 个答案:

答案 0 :(得分:3)

你可以通过这样做来实现这一点。

我使用了一个函数将逗号分隔值拆分为一个表来进行说明。

CREATE FUNCTION [dbo].[Split]
(
    @RowData nvarchar(2000),
    @SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(
    Id int identity(1,1),
    Data nvarchar(100)
) 
AS  
BEGIN 
    Declare @Cnt int
    Set @Cnt = 1

    While (Charindex(@SplitOn,@RowData)>0)
    Begin
        Insert Into @RtnValue (data)
        Select 
            Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

        Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
        Set @Cnt = @Cnt + 1
    End

    Insert Into @RtnValue (data)
    Select Data = ltrim(rtrim(@RowData))

    Return
END
GO


DECLARE @WB_LIST varchar(1024) = '123,125,764,256,157';
DECLARE @WB_LIST_IN_DB varchar(1024) = '123,125,795,256,157,789';

DECLARE @TABLE_UPDATE_LIST_IN_DB TABLE ( id varchar(20));
DECLARE @TABLE_UPDATE_LIST TABLE ( id varchar(20));

INSERT INTO @TABLE_UPDATE_LIST
SELECT data FROM dbo.Split(@WB_LIST,',');

INSERT INTO @TABLE_UPDATE_LIST_IN_DB
SELECT data FROM dbo.Split(@LIST_IN_DB,',');


SELECT * FROM @TABLE_UPDATE_LIST
EXCEPT
SELECT * FROM @TABLE_UPDATE_LIST_IN_DB
UNION
SELECT * FROM @TABLE_UPDATE_LIST_IN_DB
EXCEPT
SELECT * FROM @TABLE_UPDATE_LIST;

答案 1 :(得分:2)

这是解决方案。示例数据来自SSRS 2008 R2附带的ReportServer数据库,但您可以在任何数据集上使用它:

SELECT s.name, s.type 
FROM 
(
    SELECT s1.name, s1.type
    FROM syscolumns s1
    WHERE object_name(s1.id) = 'executionlog2'
    UNION ALL 
    SELECT s2.name, s2.type
    FROM syscolumns s2 
    WHERE object_name(s2.id) = 'executionlog3'
) AS s 
GROUP BY s.name, s.type   
HAVING COUNT(s.name) = 1

答案 2 :(得分:1)

我的第一反应是建议以不可疑的方式再次复制到另一台机器。

如果这不是一个选项,也许Red Gate提供的某些工具可以满足您的需求。

(我绝不会对Red Gate感到满意,只记得Joel提到他们的工具在播客上有多好。)

答案 3 :(得分:1)

SQL Server 2000添加了“EXCEPT”关键字,这与Oracle的“减号”几乎完全相同

SELECT * FROM TBL_A WHERE ...
EXCEPT
SELECT * FROM TBL_B WHERE ...

答案 4 :(得分:0)

使用Red Gate之前的SQL比较工具。它比较了scheamas,SQL Data Compare工具比较数据。我认为您可以为他们免费试用,但如果这是一个反复出现的问题,您也可以购买它们。可能有像这样的开源或免费工具,但你可能只是得到这个。