2017-05-04 56 views
1

我有一個名爲Content的表,其中有一個名爲data的varchar(max)列。varchar(max)列中的SQL查詢xml屬性

本專欄中的數據是XML格式(請注意,我沒有設計數據庫,所以我不知道爲什麼這個列不僅僅是XML格式,還有其他幾個XML列相同的數據庫...去圖...),我想查詢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的每個值(必須添加結束標記)。該.nodes()通話將允許相同的查詢,如果在你的<p3:productList>許多不同<p3:product>元素:

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

真棒,這個作品一種享受。圖例:o) –