2014-09-28 47 views
0

我嘗試了幾種方法來查詢這些數據,但尚未成功。我在SQL Server 2012上。任何幫助將不勝感激。使用xml中包含的樣式表/名稱空間查詢XML

<NewDataSet> 
    <Table> 
    <_x005B_M_x005D_._x005B_SEQID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:short">200</_x005B_M_x005D_._x005B_SEQID_x005D_> 
    <_x005B_M_x005D_._x005B_CPID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1002</_x005B_M_x005D_._x005B_CPID_x005D_> 
    </Table> 
</NewDataSet> 
+0

另外 - 此文檔的根名稱空間是什麼? – 2014-09-28 19:18:21

+0

...你試過什麼樣的疑問?展示你的工作。 – 2014-09-28 19:19:21

+0

我在這裏看到的唯一命名空間是用於'xs'和'xsi'前綴,並且您的標記不使用任何名稱空間前綴,因此它們應該完全不相關。 – 2014-09-28 19:19:54

回答

0
declare @demo xml = '<NewDataSet> 
    <Table> 
    <_x005B_M_x005D_._x005B_SEQID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:short">200</_x005B_M_x005D_._x005B_SEQID_x005D_> 
    <_x005B_M_x005D_._x005B_CPID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1002</_x005B_M_x005D_._x005B_CPID_x005D_> 
    </Table> 
</NewDataSet>' 

select t.r.value('(./*[local-name()=''_x005B_M_x005D_._x005B_SEQID_x005D_'']/text())[1]','integer') seqid 
, t.r.value('(./*[local-name()=''_x005B_M_x005D_._x005B_CPID_x005D_'']/text())[1]','nvarchar(128)') cpid 
from @demo.nodes('/*/*') t(r) 

SQL小提琴:http://sqlfiddle.com/#!6/d41d8/21769

1

這將有助於對你想要什麼擺脫這一點,但這裏是一個開始更多的細節,假設每個元素的XML表示行:

DECLARE @SampleData XML = N' 
<NewDataSet> 
    <Table> 
    <_x005B_M_x005D_._x005B_SEQID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:short">200</_x005B_M_x005D_._x005B_SEQID_x005D_> 
    <_x005B_M_x005D_._x005B_CPID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1002</_x005B_M_x005D_._x005B_CPID_x005D_> 
    </Table> 
</NewDataSet> 
'; 

DECLARE @Delim VARCHAR(50) = '._x005B_'; 
DECLARE @DelimLen INT = LEN(@Delim); 

;WITH cte AS 
(
    SELECT xrow.value('local-name(.)', 'VARCHAR(50)') AS [ElementName], 
      xrow.value('declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance"; (./@xsi:type)[1]', 'VARCHAR(50)') AS [xsi:type], 
      xrow.value('./text()[1]', N'VARCHAR(50)') AS [ElementValue] 
    FROM @SampleData.nodes('NewDataSet/Table/*') t(xrow) 
) 
SELECT *, 
     SUBSTRING(
      cte.ElementName, 
      CHARINDEX(@Delim, cte.ElementName) + @DelimLen, 
      CHARINDEX('_', 
        cte.ElementName, 
        CHARINDEX(@Delim, cte.ElementName) + @DelimLen + 1) - 
         (CHARINDEX(@Delim, cte.ElementName) + @DelimLen) 
        ) AS [RowType] 
FROM cte; 

輸出:

ElementName       xsi:type ElementValue RowType 
_x005B_M_x005D_._x005B_SEQID_x005D_ xs:short 200   SEQID 
_x005B_M_x005D_._x005B_CPID_x005D_ xs:string 1002   CPID