2008-09-16 13 views
1

這是我一直在努力解決的一個問題。我不是一個數據庫專家,所以這可能有點兒晦澀。十分抱歉。在SQL Server中實現對稱差異嗎?

我有一個給定的數據庫D,它已經在另一臺機器上覆制(可能是可疑的方式),導致數據庫D'。我的任務是檢查數據庫D和D'是否完全相同。

問題當然是如果他們不是真正做到的話。爲此,我的想法是在每個對應的表上運行對稱差異並查看差異。

有一個「大」數量的表,所以我不希望手動運行每個對稱差異。然後,我如何實現可以在任意表上運行而不必明確列舉列的對稱差異「函數」(或存儲過程,或任何您想要的)?

這是在Windows上運行的,如果您不遵循,您的對衝基金將會爆炸。祝你好運。

+0

好吧,紅門當然是一個解決方案。 但是,這不應該是一個非常普遍的問題嗎?不應該有一個簡單的程序化解決方案? – Jake 2008-09-16 01:31:03

回答

1

我的第一反應是建議以非可疑的方式再次複製到另一臺機器。

如果這不是一個選項,那麼Red Gate中的一些工具可能會滿足您的需求。

(我在沒有辦法與紅門affliated,只記得喬爾提他們的工具有多麼出色的播客。)

+0

啊。你打敗了我! – 2008-09-16 01:02:54

0

使用SQL通過Red Gate比較工具。它比較模式,並且SQL數據比較工具比較數據。我認爲你可以爲他們免費試用,但如果這是一個反覆出現的問題,你可以購買它們。可能有像這樣的開源或免費工具,但你可能只是得到這個。

2

以下是解決方案。示例數據是從自帶的SSRS 2008 R2中的Report Server數據庫,但是你可以用它在任何數據集:

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 
1

SQL Server 2000中新增了「除」關鍵字,它幾乎是完全一樣的甲骨文「減「

SELECT * FROM TBL_A WHERE ... 
EXCEPT 
SELECT * FROM TBL_B WHERE ... 
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;