2011-09-15 9 views
2

実際にXMLデータを含む同じNVARCHARフィールドを持つ2つのテーブルがあります。 場合によっては、実際のXMLフィールドは他のテーブルの1行と同じですが、と異なるため、は属性の順序が異なります。SQLのXmlデータを比較

と同じXMLフィールドを決定するには、私のような比較の持っている必要があります、

XMLデータ型は比較またはソートすることはできません。

cast('<root><book b="" c="" a=""/></root>' as XML) 
= cast('<root><book a="" b="" c=""/></root>' as XML) 

を私は、このエラーメッセージを取得します IS NULL演算子を使用する場合を除きます。

次に、同じXMLをNVARCHARに再キャストすることなく同じXMLを判断する最適なソリューションは何ですか?

+2

XMLを構文的に比較するのではなく、XMLテキスト表現の実際の**意味**に基づいているのは、実際は非常に難しいビジネスです。 SQL Server内でこれを簡単に実行できるかどうかは疑いの余地はありません。ほとんどの場合、XMLを解析して**解釈して同じかどうかを判断できるアプリを使用する必要があります。簡単なテキスト比較は簡単ではありません。 –

+0

sqlで独自のxmlパーサをロールしないでください。あなたの選択した言語から活用できる確立されたものを使用してください。 –

答えて

2

なぜそれをまったくキャストしますか?一時表のXML列にプラグインし、Xqueryを実行して他の表と比較します。編集:比較の含まれている例。 XMLに対してクエリを実行して、同じ行を取得する方法はたくさんあります。クエリがどのように書かれているのかは、プリファレンス、要件などに依存します。私は/ countで単純なグループを使いましたが、重複して検索されている列に対して自己結合(WHERE EXISTS)を使用することができます。

CREATE TABLE #Test (SomeXML NVARCHAR(MAX)) 
CREATE TABLE #XML (SomeXML XML) 

INSERT #Test (SomeXML) 
VALUES('<root><book b="b" c="c" a="a"/></root>') 
    ,('<root><book a="a" b="b" c="c"/></root>') 

INSERT #XML (SomeXML) 

SELECT SomeXML FROM #Test; 

WITH XMLCompare (a,b,c) 
AS 
(
SELECT 
    x.c.value('@a[1]','char(1)') AS a 
    ,x.c.value('@b[1]','char(1)') AS b 
    ,x.c.value('@c[1]','char(1)') AS c 
FROM #XML 
CROSS APPLY SomeXMl.nodes('/root/book') X(C) 
) 

SELECT 
    a 
    ,b 
    ,c 
FROM XMLCompare as a 
GROUP BY 
    a 
    ,b 
    ,c 
HAVING COUNT(*) >1 
+0

それらを比較する方法? – ARZ

+0

@ARZ、XQuery。比較でのリビジョンの転記。 – Wil

+0

お返事ありがとうございます。 XMLの本文全体を直接比較する方法は? (すべての属性を個別に比較することなく) – ARZ

関連する問題