SQL Server는 일반적으로 결과 집합을 분석 할 때별로 도움이되지 않습니다. 동적 인 SQL이 있고 - tatatataaaaa가 있습니다! - XML. 알 수없는 세트를 다루는 XML의 능력에 정말 감사드립니다!
DECLARE @tbl1 TABLE(ID INT,Value1 VARCHAR(10),Value2 VARCHAR,PointInTime DATETIME);
INSERT INTO @tbl1 VALUES
(1,'a','b',{d'2017-01-01'})
,(2,'a','b',{d'2017-01-02'})
,(3,'a','x',{d'2017-01-03'})
,(4,NULL,'b',{d'2017-01-04'})
DECLARE @tbl2 TABLE(ID INT,Value1 VARCHAR(10),Value2 VARCHAR,PointInTime DATETIME);
INSERT INTO @tbl2 VALUES
(1,'a','b',{d'2017-01-01'})
,(2,NULL,'b',{d'2017-01-02'})
,(3,'a','x',{d'2017-01-03'})
,(4,'y','b',{d'2017-01-05'});
--This이 전나무 테이블
DECLARE @xml1 XML=
(
SELECT *
FROM @tbl1 AS tbl
FOR XML RAW,ELEMENTS XSINIL,TYPE
);
--check 출력
/*
SELECT @xml1;
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ID>1</ID>
<Value1>a</Value1>
<Value2>b</Value2>
<PointInTime>2017-01-01T00:00:00</PointInTime>
</row>
[...more rows..]
*/
--Same과에서 XML을 생성합니다 두 번째 표
DECLARE @xml2 XML=
(
SELECT *
FROM @tbl2 AS tbl
FOR XML RAW,ELEMENTS XSINIL,TYPE
);
- 우리는 t는
DECLARE @rowIDName NVARCHAR(100)=N'ID';
--Two 열팽창 계수가
WITH AllVals1 AS
(
SELECT nd.value(N'(../*[local-name()=sql:variable("@rowIDName")])[1]',N'nvarchar(max)') AS RowID
,nd.value(N'local-name(.)',N'nvarchar(max)') AS ElementName
,nd.value(N'.',N'nvarchar(max)') AS ElementValue
FROM @xml1.nodes(N'/row/*') AS A(nd)
)
,AllVals2 AS
(
SELECT nd.value(N'(../*[local-name()=sql:variable("@rowIDName")])[1]',N'nvarchar(max)') AS RowID
,nd.value(N'local-name(.)',N'nvarchar(max)') AS ElementName
,nd.value(N'.',N'nvarchar(max)') AS ElementValue
FROM @xml2.nodes(N'/row/*') AS A(nd)
)
SELECT v1.RowID,v1.ElementName,v1.ElementValue AS V1,v2.ElementValue AS V2
FROM AllVals1 AS v1
FULL OUTER JOIN AllVals2 AS v2 ON v1.RowID=v2.RowID AND v1.ElementName=v2.ElementName
WHERE v1.ElementValue<>v2.ElementValue
쉽게 비교할 수 있습니다 ID - 이름 - 값 tupels의 목록을 작성, 행의 ID의 이름이 나중에 조인 SQL-서버에게 결과 프로그램은, 그 행 2 "값 1"에서 "A"이고 현재 비어 있고 4 열 "값 1은"비어 이제 "Y"이고 "POINTINTIME가 다릅니다
RowID ElementName V1 V2
2 Value1 a
4 Value1 y
4 PointInTime 2017-01-04T00:00:00 2017-01-05T00:00:00
읽기 ['제외 대해서 '] (https://msdn.microsoft.com/en-us/library/ms188055.aspx) –
@ZoharPeled 좋은 힌트지만 차이가있는 곳이면 모든 행에 대해 'EXCEPT'가 반환됩니다. 많은 컬럼을 통해 책임있는 가치를 찾기가 어려울 것입니다 ... – Shnugo