2017-05-02 9 views
2

dataというvarchar(max)の列を持つContentというテーブルがあります。varchar(max)列のSQLクエリxmlデータ

この列のデータはXML形式であり、XMLの属性を照会する必要があります。

以下はXMLの上位2行です。p3:manifestId私の出力が基本的にSome_Dataになるように照会したいのです(私は明らかにこれを脱感作しました)。

これは可能ですか?

<manifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p3="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://www.w3.org/2001/XMLSchema-instance" 
     p3:manifestDateTime="2016-02-17T17:34:29.5925096Z" 
     p3:manifestVersion="1.1" p3:manifestId="Some_Data"> 
    <p3:productList> 
    <p3:product p3:releaseDateTime="2016-02-17T17:34:29.5925096Z"   p3:installSeqId="2" p3:uninstallSeqId="2" p3:releaseNum="1" p3:productType="doc" p3:productId="WEDREZ020RRRP0GGG001" p3:mfgCode="GIRE"> 
+1

dbmsにタグを付けてください。 – McNets

+0

XMLが格納されていれば、(なぜなら 'VARCHAR(MAX)'の代わりに) 'XML'データ型ではないのですか?それははるかに効率的で、クエリはほんの少しだけ簡単になります。常に**最も適切な**データ型を使用するべきです。 –

+0

お試しいただいた内容や、ご使用のエラーメッセージや問題を表示できますか?ここでは、キーが名前空間の定義とクエリ内の参照を適切に含んでいることについて今説明します。 – pmbAustin

答えて

1

ここでは複雑になる可能性があるのは名前空間だけです。このXMLはどのように生成されますか?これは、デフォルトとして2つの異なるエイリアスと同じ名前空間(http://www.w3.org/2001/XMLSchema-instance)を参照してくださいするのは非常に異例のことだ...

DECLARE @mockup TABLE(ID INT IDENTITY, YourXML VARCHAR(MAX)); 

INSERT INTO @mockup VALUES 
('<manifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:p3="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://www.w3.org/2001/XMLSchema-instance" 
      p3:manifestDateTime="2016-02-17T17:34:29.5925096Z" 
      p3:manifestVersion="1.1" p3:manifestId="Some_Data"> 
    <!--Some more stuff--> 
    </manifest>'); 

- このアプローチは、すべての名前空間を見ていません。私は(ほとんどの場合、最良の方法)*:

SELECT CAST(YourXML AS XML).value(N'(/*:manifest/@*:manifestId)[1]',N'nvarchar(max)') 
FROM @mockup; 

- このアプローチは、事前にすべての必要な名前空間を宣言し、ワイルドカードを使用します。

WITH XMLNAMESPACES(DEFAULT 'http://www.w3.org/2001/XMLSchema-instance' 
          ,'http://www.w3.org/2001/XMLSchema-instance' AS p3) 
SELECT CAST(YourXML AS XML).value(N'(/manifest/@p3:manifestId)[1]',N'nvarchar(max)') 
FROM @mockup; 

- このアプローチで、あなたが本当に必要としない場合には、便利です複数の値。私は、この名前空間のすべての異なる出現に対して1つのエイリアスns1を使用します:

SELECT CAST(YourXML AS XML).value(N'declare namespace ns1="http://www.w3.org/2001/XMLSchema-instance"; 
            (/ns1:manifest/@ns1:manifestId)[1]',N'nvarchar(max)') 
FROM @mockup; 
関連する問題