2017-10-12 1 views
0

2 xml 변수 (@ xml1 & @ xml2)가 있고 각 노드의 값을 비교하고 다른 노드 만 포함하는 xml을 반환해야합니다. . 나는 그것을 반환하고 싶습니다T-SQL : 2 XML 비교 및 ​​다른 값을 가진 노드 반환

declare @xml1 xml = N'<row> 
    <id>1</id> 
    <name>record title</name> 
    <description>sample description</description> 
</row>' 
declare @xml2 xml = N'<row> 
    <id>1</id> 
    <name>record title</name> 
    <description>updated sample description</description> 
</row>' 

:

그래서 나는이 2 XML 변수를 가지고 말을

SELECT @xml1 = N'<row> 
    <description>sample description</description> 
</row>', @xml2 = N'<row> 
    <description>updated sample description</description> 
</row>' 

나는 내가 필요로 무엇의 종류를 반환하는 다음 쿼리를 가지고 있지만, 목 : 그 피봇 &는

SELECT 
     NV.NodeName, 
     OV.NodeValue OldValue, 
     NV.NodeValue NewValue 
FROM 
(SELECT T.N.value('local-name(.)', 'nvarchar(100)') NodeName, 
       T.N.value('.', 'nvarchar(100)') NodeValue 
      FROM @xml1.nodes('/row/*') T(N)) NV 
CROSS APPLY (SELECT T.N.value('local-name(.)', 'nvarchar(100)') NodeName, 
       T.N.value('.', 'nvarchar(100)') NodeValue 
      FROM @xml2.nodes('/row/*') T(N)) OV 
WHERE OV.NodeName = NV.NodeName AND OV.NodeValue <> NV.NodeValue 

성능 주요되는 XML 노드 등 : 없습니다 코드가 트리거에 있으므로 빨리 실행해야하며 속도가 느려지므로 PIVOT을 사용하는 것이 두려워요. 이미 값을 비교하여 XML 값으로 반환하는 더 좋은 방법이 있기를 바랍니다.

아이디어가 있으십니까? 미리 감사드립니다. -

답변

0

신경 끄시이 길 사람 다운하는 데 도움이 경우 ) = 그것을 알아 냈 :

의 DECLARE @의 XMLString1 VARCHAR (MAX) = '', XMLString2 VARCHAR (MAX) = @ ''을;

SELECT @XMLString1 += '<' + OV.NodeName + '>' + LEFT(OV.NodeValue, 8000) + '</' + OV.NodeName + '>', 
     @XMLString2 += '<' + NV.NodeName + '>' + LEFT(NV.NodeValue, 8000) + '</' + NV.NodeName + '>' 
FROM 
    (SELECT T.N.value('local-name(.)', 'varchar(255)') NodeName, 
      T.N.value('.', 'varchar(8000)') NodeValue 
    FROM @xml1.nodes('/row/*') T(N)) NV 
CROSS APPLY 
    (SELECT T.N.value('local-name(.)', 'varchar(255)') NodeName, 
      T.N.value('.', 'varchar(8000)') NodeValue 
    FROM @xml2.nodes('/row/*') T(N)) OV 
WHERE OV.NodeName = NV.NodeName AND OV.NodeValue <> NV.NodeValue 
SET @XMLString1 = '<row>' + ISNULL(@XMLString1, '') + '</row>'; 
SET @XMLString2 = '<row>' + ISNULL(@XMLString2, '') + '</row>'; 

SELECT CONVERT(XML, @XMLString1) xml1, CONVERT(XML, @XMLString2) xml2 
관련 문제