2008-09-16 4 views
1

다음은 직장에서 해결하려고 시도한 문제입니다. 나는 데이터베이스 전문가가 아니므로, 아마도 이것은 약간 고질적 인 것입니다. 모든 사과.SQL Server에서 대칭 차이를 구현합니까?

다른 데이터베이스 (예를 들어 어쩌면 모호한 방식으로)에 복제되어 데이터베이스 D '가 생성 된 특정 데이터베이스 D가 있습니다. 데이터베이스 D와 D '가 실제로 정확히 동일한 지 확인하는 것은 제 작업입니다.

문제는 물론 실제로 그렇지 않은 경우 문제입니다. 이 목적을 위해, 내 생각은 각각의 테이블에 대해 대칭 차이를 실행하고 차이를 확인하는 것이었다.

"많은 수의 테이블이 있으므로 손으로 각 대칭 차이를 실행하지 않으려합니다. 그렇다면 명시 적으로 열을 열거하지 않고 임의의 테이블에서 실행할 수있는 대칭 차이 "함수"(또는 저장 프로 시저 또는 원하는대로)를 구현하는 방법은 무엇입니까?

Windows에서 실행 중이며, 사용자가 수행하지 않으면 헤지 펀드가 폭발합니다. 행운을 빕니다.

+0

좋습니다. 레드 게이트는 확실히 해결책입니다. 그러나 이것은 매우 일반적인 문제가 아니어야합니까? 직접적인 프로그래밍 방식의 솔루션이 없어야합니까? – Jake

답변

1

첫 번째 반응은 모호하지 않은 방식으로 다른 컴퓨터에 다시 복제 할 것을 제안하는 것입니다.

이것이 아닌 경우 Red Gate에서 제공하는 도구 중 일부는 필요한 것을 수행 할 수 있습니다.

는 (난 그냥 조엘은 자신의 도구가 팟 캐스트에 얼마나 좋은 언급 기억, 레드 게이트와 affliated 어떠한 방식으로 생각합니다.)

+0

아. 너는 나를 펀치에 이겼다! –

0

는 SQL이 Red Gate에 의해 도구를 비교합니다. scheamas를 비교하고 SQL 데이터 비교 도구는 데이터를 비교합니다. 나는 당신이 그들에 대한 무료 평가판을 얻을 수 있다고 생각하지만, 이것이 반복적 인 문제라면 그것들을 살 수도있다. 이와 같은 오픈 소스 또는 무료 도구가있을 수 있지만,이 도구를 얻을 수도 있습니다.

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 
1

SQL Server 2000에 추가 된 거의 정확하게 오라클의 "과 동일 키워드"를 제외하고 " 마이너스 "

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

이런 식으로하면됩니다.

필자는 쉼표로 구분 된 값을 demostrate 할 테이블로 분리하는 함수를 사용했습니다.

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;