2017-10-12 2 views
0

2つのxml変数(@ xml1 & @ xml2)があり、それぞれのノードの値を比較し、異なるノードのみを含むxmlを返す必要があります。T-SQL:2のXMLを比較し、値の異なるノードを返す

だから私はこれらの2つのXML変数を持っている、と言う:私は、私は必要なもののようなものを返す次のクエリを持って

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

、しかし:私はそれを返すしたい

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>' 

そのなど、&は、XMLノードを持たないアンピボット:

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 

パフォーマンスが鍵です:Thのコードがトリガーに入っているので、速く実行する必要があり、遅い傾向があるので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 
関連する問題