Sql server 查询XML中包含样式表/命名空间的XML

Sql server 查询XML中包含样式表/命名空间的XML,sql-server,xml,sql-server-2012,Sql Server,Xml,Sql Server 2012,我尝试了几种方法来查询这些数据,但都没有成功。我使用的是SQL Server 2012。任何帮助都将不胜感激 <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

我尝试了几种方法来查询这些数据,但都没有成功。我使用的是SQL Server 2012。任何帮助都将不胜感激

<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>

SQL Fiddle:

了解更多关于您希望从中得到什么的详细信息会有所帮助,但这里是一个开始,假设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;

另外-此文档的根命名空间是什么?…您已经尝试了哪些查询?展示您的工作。我在这里看到的唯一名称空间是xs和xsi前缀,并且您的标记没有使用任何一个名称空间前缀,因此它们应该完全无关。在我看来,这不像XML。结束标记在哪里?。你确定你贴对了吗?如果是这样的话,请忘记使用基于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