2017-07-06 120 views
0

我一直在摔跤幾個小時,我完全搞不清楚爲什麼它不工作。我將以下XML作爲單個列(以這種方式存儲幾十條記錄)。將XML拆分成行(TSQL)

<dsMQ1License xmlns="http://tempuri.org/dsMQ1License.xsd"> 
    <licenseModuleInfo> 
    <module>AP</module> 
    <status>1</status> 
    <statusEndDate>2007-12-28T00:00:00.0000000-05:00</statusEndDate> 
    </licenseModuleInfo> 
    <licenseModuleInfo> 
    <module>AU</module> 
    <status>1</status> 
    <statusEndDate>2007-12-28T00:00:00.0000000-05:00</statusEndDate> 
    </licenseModuleInfo> 
    <licenseModuleInfo> 
    <module>CO</module> 
    <status>1</status> 
    <statusEndDate>2007-12-28T00:00:00.0000000-05:00</statusEndDate> 
    </licenseModuleInfo> 
    <licenseModuleInfo> 
    <module>DO</module> 
    <status>1</status> 
    <statusEndDate>2007-12-28T00:00:00.0000000-05:00</statusEndDate> 
    </licenseModuleInfo> 
. 
. 
. 
</dsMQ1License> 

我希望能夠把XML列,並將其變成行,其中每列代表最內層的元素。

 
+--------+--------+---------------+ 
| Module | Status | StatusEndDate | 
+--------+--------+---------------+ 
| AD  |  1 | 2017-12-28 | 
| AU  |  1 | 2017-12-28 | 
| CO  |  1 | 2017-12-28 | 
| DO  |  1 | 2017-12-28 | 
+--------+--------+---------------+ 

基於迄今爲止我讀過的所有內容,我覺得我所做的一切應該起作用。

SELECT 
T.C.value('(module)[1]','VARCHAR(MAX)') AS ModuleAbbr 
,T.C.value('(status)[1]','bit') AS Active 
FROM LicenseXML 
CROSS APPLY LicenseXML.License.nodes('/dsMQ1License/licenseModuleInfo') T(C) 

但它只是返回0行。

我哪裏錯了?

回答

2

嘗試這個

DECLARE @x xml = '<dsMQ1License xmlns="http://tempuri.org/dsMQ1License.xsd"> 

    <licenseModuleInfo> 

    <module>AP</module> 

    <status>1</status> 

    <statusEndDate>2007-12-28T00:00:00.0000000-05:00</statusEndDate> 

    </licenseModuleInfo> 

    <licenseModuleInfo> 

    <module>AU</module> 

    <status>1</status> 

    <statusEndDate>2007-12-28T00:00:00.0000000-05:00</statusEndDate> 

    </licenseModuleInfo> 

    <licenseModuleInfo> 

    <module>CO</module> 

    <status>1</status> 

    <statusEndDate>2007-12-28T00:00:00.0000000-05:00</statusEndDate> 

    </licenseModuleInfo> 

    <licenseModuleInfo> 

    <module>DO</module> 

    <status>1</status> 

    <statusEndDate>2007-12-28T00:00:00.0000000-05:00</statusEndDate> 

    </licenseModuleInfo> 

</dsMQ1License>' 



;WITH XMLNAMESPACES 

(

DEFAULT 'http://tempuri.org/dsMQ1License.xsd' 

) 

    SELECT 

    x.item.value('module[1]','VARCHAR(100)') AS ModuleAbbr 

    ,x.item.value('status[1]','bit') AS Active 

    ,x.item.value('statusEndDate[1]','datetime') AS EndDate 

    FROM @x.nodes('//dsMQ1License/licenseModuleInfo') AS x(item) 
+0

謝謝,這使我得到了正確的答案。我正在使用一系列子查詢來實際獲取XML,但我無法讓您的解決方案使用這些子查詢,但我注意到您定義了命名空間,在幾個小時後,我能夠獲得加工。我已經用我最終使用的解決方案添加了自己的帖子。 – Konraden

+0

由於您還沒有提供表結構,我已經聲明xml爲變量 – SQL006

0

我使用with語句和一些子查詢居然找到許可證。最終,定義名稱空間和使用名稱空間別名是完成這項工作的原因。

WITH XMLNAMESPACES ('http://tempuri.org/dsMQ1License.xsd' AS ns) 
,LicenseXML AS (
SELECT CAST(License AS XML) AS License 
    FROM (
     SELECT a.i.value('.','varchar(max)') AS License 
     FROM 
      (SELECT CAST(memLicense AS XML) memLicense FROM tblMQ1SysLicense) AS X 
      CROSS APPLY X.memLicense.nodes('/License') AS a(i) 
     ) AS LicXML 
) 
SELECT 
T.C.value('ns:module[1]','VARCHAR(MAX)') AS ModuleAbbr 
,T.C.value('ns:status[1]','bit') AS Active 
,T.C.value('ns:statusEndDate[1]','DATE') AS StatusDate 
FROM LicenseXML 
CROSS APPLY LicenseXML.License.nodes('/ns:dsMQ1License/ns:licenseModuleInfo') T(C)