0

두 입력 테이블 간의 차이를 계산하는 저장 프로 시저를 작성하려고합니다.두 개의 입력 테이블을 비교하기 위해 테이블 ​​반환 매개 변수와 함께 저장 프로 시저를 사용하는 방법

저장 프로 시저 개의 테이블 간의 차이를 (테이블 모두가 동일한 미리 정의 된 테이블 구조를 갖는다), 기록을 제공 할 프로 시저가 제거되거나 표 2

예 표 1과 비교할 때 업데이트 첨가 계산하는 데 사용 :

  • 표 1은 새로운 3 개 기록 갖는다 : A, B 및 C를
  • 표 2는 3 개 기록 가지고 B ', C 및 D
0

B '는,이 프로 시저 호출의 출력은 I가 두 표 사이의 차이를 계산하기위한 질의를 작성한

A-addition 
B-update 
D-Removal 

것이다

레코드 B 내의 하나의 변화 나 여러 필드를 나타내고 스토어드 프로 시저로 변환하기가 어려웠습니다.

테이블 구조 :

X varchar (10) 
Y int 
Z datetime 


SELECT 
    table1.*, ChangeType = 'Addition' 
FROM 
    table1 
WHERE 
    NOT EXISTS (SELECT * 
       FROM table2 
       WHERE table1.x = table2.x) 

UNION ALL 

SELECT 
    table2.*, ChangeType = 'Removal' 
FROM 
    table2 
WHERE 
    NOT EXISTS (SELECT * 
       FROM table1 
       WHERE table1.x = table2.x) 

UNION ALL 

SELECT 
    table1, ChangeType = 'Update' 
FROM 
    table2 
INNER JOIN 
    table1 ON table1.x = table2.x 
WHERE 
    table1.Y <> table2.Y OR table1.Z <> table2.Z 

또한뿐만 아니라 저장 프로 시저 실행 스크립트를 기입하십시오.

답변

-1

나는 액션을 분류하기 위해 case 문을 사용하는 단일 단계를 선호합니다.

CREATE PROCEDURE CompareTables 
AS 
BEGIN 
    SELECT ChangeType = CASE 
          WHEN table2.x IS NULL THEN 
          'Addition' 
          WHEN table1.x IS NULL THEN 
          'Removal' 
          WHEN table1.Y <> table2.Y 
           OR table1.Z <> table2.Z THEN 
          'Update' 
          ELSE 
          'No Change' 
         END, 
      table1.*, 
      table2.* 
    FROM table2 
    FULL OUTER JOIN table1 
     ON table1.x = table2.x 
    WHERE table2.x IS NULL 
     OR table1.x IS NULL 
     OR NOT (table1.Y = table2.Y 
        AND table1.Z = table2.Z 
       ); 
END; 
+0

을 만들 여기에있는 질문은 테이블 비교 논리에 관한 것이 아니라 처음에는 테이블 값 매개 변수로 테이블을 전달하는 것입니다. 그러나 새로운 비교 논리에 대한 제안은 환영합니다. –

+0

테이블을 매개 변수로 전달해야하는 이유는 무엇입니까? 왜 그들은 SP에 의해 직접적으로 참조 될 수 없습니까? –

+0

테이블이 항상 같은 테이블이 아니기 때문에 향후 변경을 허용하고 싶습니다. 따라서 저장 프로 시저를 작성합니다. –

0

나는 당신이 머지 문장을 찾고 있다고 생각합니다. 당신은 소스 특정 값을 기준으로 대상 및 표 2로 표를 넣어 경우 일치 여부 수행 할 작업을 결정할 수 있습니다 : 귀하의 경우 https://msdn.microsoft.com/en-us/library/bb510625.aspx

를이 될 것 같은 뭔가 :

MERGE table1 AS target 
USING table2 AS source (x, y, z) 
ON (target.x= source.x) 
WHEN MATCHED 
--do something 
WHEN NOT MATCHED BY TARGET 
--do something different 
WHEN NOT MATCHED BY SOURCE 
--something else 

로 방법 SP에에 매개 변수로 테이블을 받기 위해, 당신이 다음 단계를 수행해야합니다

  1. 은 TYPE의 tableExample을 만들

    데이터 유형을 만들기를 (X var에 문자 (10) Y의 INT, Z의 날짜)를 SP로

  2. 패스가 :

    PROC sp_mysp에서 @의 표에 tableExample @의 표 2 tableExample AS ...

+0

여기에있는 질문은 테이블 비교 논리에 관한 것이 아니라 처음에는 테이블 값 매개 변수로 테이블을 전달하는 것입니다. 그러나 새로운 비교 논리에 대한 제안은 환영합니다. –

+0

그래서 "저장 프로 시저에서 매개 변수로 테이블을 전달하는 방법은 무엇입니까?" – asemprini87

+0

질문이 업데이트되었습니다. –