2017-05-04 18 views
1

私は、dataと呼ばれるvarchar(max)カラムを持つContentというテーブルを持っています。varchar(max)カラムのSQLクエリxml属性

この列のデータはXML形式です(データベースを設計していないため、この列がXML形式ではない理由がわかりません。同じデータベース... go figure ...)、XMLの属性を照会したいと思っています。

私は以下のXMLをコピーしました。私が照会したいのは、p3:productIdの値です。現在私はこれを持っています(私がここで尋ねた別の質問から):

WITH XMLNAMESPACES(DEFAULT 'http://www.w3.org/2001/XMLSchema-instance' 
          ,'http://www.w3.org/2001/XMLSchema-instance' AS p3) 
SELECT CAST(Data AS XML).value(N'(/manifest/p3:productList/product/productId)[1]',N'nvarchar(max)') 
FROM Content 

しかしこれはすべての行にNULLが戻ってくるだけです。

確かにそれは非常に似ていますが、私の周りには頭がいっぱいではありませんし、XMLを照会する経験はあまりありません(明らかに!)。

<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

次のコードは、xmlの各値(終了タグを追加する必要があります)を抽出します。

DECLARE @xml XML= 
'<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" /> 
    </p3:productList> 
</manifest>'; 

--Thqクエリ

WITH XMLNAMESPACES(DEFAULT 'http://www.w3.org/2001/XMLSchema-instance' 
          ,'http://www.w3.org/2001/XMLSchema-instance' AS p3) 
SELECT @xml.value(N'(/manifest/@p3:manifestDateTime)[1]',N'datetime') AS manifestDateTime 
     ,@xml.value(N'(/manifest/@p3:manifestVersion)[1]',N'nvarchar(max)') AS manifestVersion 
     ,@xml.value(N'(/manifest/@p3:manifestId)[1]',N'nvarchar(max)') AS manifestId 
     ,p.value(N'@p3:releaseDateTime',N'datetime') AS Product_releaseDateTime 
     ,p.value(N'@p3:installSeqId',N'int') AS Product_installSeqId 
     ,p.value(N'@p3:uninstallSeqId',N'int') AS Product_uninstallSeqId 
     ,p.value(N'@p3:releaseNum',N'int') AS Product_releaseNum 
     ,p.value(N'@p3:productType',N'nvarchar(max)') AS Product_productType 
     ,p.value(N'@p3:productId',N'nvarchar(max)') AS Product_productId 
     ,p.value(N'@p3:mfgCode',N'nvarchar(max)') AS Product_mfgCode 
FROM @xml.nodes(N'/manifest/p3:productList/p3:product') AS A(p); 

結果

+-------------------------+-----------------+------------+-------------------------+----------------------+------------------------+--------------------+---------------------+----------------------+-----------------+ 
| manifestDateTime  | manifestVersion | manifestId | Product_releaseDateTime | Product_installSeqId | Product_uninstallSeqId | Product_releaseNum | Product_productType | Product_productId | Product_mfgCode | 
+-------------------------+-----------------+------------+-------------------------+----------------------+------------------------+--------------------+---------------------+----------------------+-----------------+ 
| 2016-02-17 17:34:29.593 | 1.1    | Some_Data | 2016-02-17 17:34:29.593 | 2     | 2      | 1     | doc     | WEDREZ020RRRP0GGG001 | GIRE   | 
+-------------------------+-----------------+------------+-------------------------+----------------------+------------------------+--------------------+---------------------+----------------------+-----------------+ 
+0

素晴らしい、これは動作します:あなたの<p3:productList>の多くの<p3:product>異なる要素が存在する場合.nodes()コールは、同じクエリを可能にします治療伝説:o) –

関連する問題