从T-SQL读取xsi:type

从T-SQL读取xsi:type,sql,xml,xpath,xquery,cross-apply,Sql,Xml,Xpath,Xquery,Cross Apply,我想从SELECT语句中的“current”节点读取xsi:type属性。我的XML如下所示: <ns2:data xmlns:ns2="http://mynamespace"> <OrderLineItems> <OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:DeactivationLineItem" id="1">

我想从SELECT语句中的“current”节点读取xsi:type属性。我的XML如下所示:

 <ns2:data xmlns:ns2="http://mynamespace">
  <OrderLineItems>
    <OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:DeactivationLineItem" id="1">
      <Product>
        <Id>5300</Id>
        <Description>DUMMY</Description>
        <Domain>ddd</Domain>
      </Product>
      <Quantity>1</Quantity>
    </OrderLineItem>
    <OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:ActivationLineItem" id="4">
      <Product>
        <Id>5340</Id>
        <Description>DUMMY</Description>
        <Domain>aaa</Domain>
      </Product>
      <Quantity>1</Quantity>
    </OrderLineItem>
    <OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:DeactivationLineItem" id="12">
      <Product>
        <Id>53200</Id>
        <Description>DUMMY</Description>
        <Domain>ccc</Domain>
      </Product>
      <Quantity>21</Quantity>
    </OrderLineItem>
  </OrderLineItems>
</ns2:data>
我的问题是LineItemType,因为它引发了一个错误: XQuery语法'@{http://www.w3.org/2001/XMLSchema-instance}:类型“”不受支持

这很奇怪,因为如果我不使用交叉应用程序,我就可以读取单个类型:

WITH  XMLNAMESPACES ('http://mynamespace' as p)
SELECT CAST(xmlFile as XML).value('(/p:data/OrderLineItems/OrderLineItem/@xsi:type)[1]','nvarchar(max)')
from tTEMP_XMLTABLE;
第二条语句适用于SQLServer2005。使用交叉应用时是否有可能读取xsi:type属性


感谢您的帮助

这在SQL Server 2008 SP1中对我有效(您没有指定版本,因此我不确定您是否拥有该版本)。我不确定您是否可以像这里一样将xml或xml副本放入非类型化的xml字段中,但这可能有助于您从我上面给您的链接中绕过模式绑定问题

DECLARE @tmp_xml TABLE (id int identity, data xml)

INSERT INTO @tmp_xml (data)
VALUES ('<ns2:data xmlns:ns2="http://mynamespace">
  <OrderLineItems>
    <OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:DeactivationLineItem" id="1">
      <Product>
        <Id>5300</Id>
        <Description>DUMMY</Description>
        <Domain>ddd</Domain>
      </Product>
      <Quantity>1</Quantity>
    </OrderLineItem>
    <OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:ActivationLineItem" id="4">
      <Product>
        <Id>5340</Id>
        <Description>DUMMY</Description>
        <Domain>aaa</Domain>
      </Product>
      <Quantity>1</Quantity>
    </OrderLineItem>
    <OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:DeactivationLineItem" id="12">
      <Product>
        <Id>53200</Id>
        <Description>DUMMY</Description>
        <Domain>ccc</Domain>
      </Product>
      <Quantity>21</Quantity>
    </OrderLineItem>
  </OrderLineItems>
</ns2:data>')

;WITH XMLNAMESPACES('http://mynamespace' AS ns)
SELECT
OrderLineItemID                = ref.value('@id', 'int')
,OrderLineItemParentID          = ref.value('@parentId', 'int')
,ProductID                      = NULLIF(ref.query('Product/Id').value('.', 'varchar(255)'),'')
,ProductDescription             = NULLIF(ref.query('Product/Description').value('.', 'varchar(255)'),'')
,ProductDomain                  = NULLIF(ref.query('Product/Domain').value('.', 'varchar(255)'),'')
,ProductAdditionalInfo          = NULLIF(ref.query('Product/AdditionalInfo').value('.', 'varchar(255)'),'')
,Quantity                       = ref.query('Quantity').value('.', 'int')

,LineItemType                   = ref.value('@xsi:type','varchar(max)')                 

FROM @tmp_xml t
    CROSS APPLY data.nodes('/ns:data/OrderLineItems/OrderLineItem') R(ref) 
DECLARE@tmp_xml表(id int-identity,数据xml)
插入@tmp_xml(数据)
价值('
5300
笨蛋
ddd
1.
5340
笨蛋
aaa
1.
53200
笨蛋
ccc
21
')
;使用XMLNAMESPACES('http://mynamespace'作为ns)
挑选
OrderLineItemID=ref.value('@id','int')
,OrderLineItemParentID=ref.value(“@parentId”,“int”)
,ProductID=NULLIF(ref.query('Product/Id')。值('.','varchar(255)','')
,ProductDescription=NULLIF(ref.query('Product/Description')。值('.','varchar(255'),'')
,ProductDomain=NULLIF(ref.query('Product/Domain')。值('.','varchar(255'),'')
,ProductAdditionalInfo=NULLIF(ref.query('Product/AdditionalInfo')。值('.','varchar(255'),'')
,Quantity=ref.query('Quantity')。值('.','int')
,LineItemType=ref.value('@xsi:type','varchar(max)'
来自@tmp_xml t
交叉应用数据.nodes('/ns:data/OrderLineItems/OrderLineItem')R(ref)

[本文][1]可能会有所帮助。。。[1] :谢谢,但这描述了我发布的第二条sql语句。我需要阅读CrossApplyInterest中的所有类型。“xmlFile”是什么类型的?如果我将它存储在一个xml类型的变量中,我就能够让它对xml起作用。“xmlFile”是tTEMP_XMLTABLE中的一个列名,数据类型是xml(后面有一个XSD模式)啊,这可能就是问题所在。请参见下文,了解我是如何通过将其放入表中的非类型化xml字段(在本例中为表变量)使其工作的。不确定这对你是否可行,但它确实有效。非常感谢,这很有效!但是我不能使用非类型化的XML字段。是否有可能将其用于类型化XML(后面是XSD模式)?根据另一篇文章,我想说没有。但是您是否可以使用一个计算列来扩充表的模式,将类型化XML转换为非类型化XML,并将其用于类型提取?您仍然可以将类型化XML列用于任何需要绑定模式的操作。非常感谢。现在,我对所有值都使用类型化XML,并使用一个带有非类型化XML列的Tentiable来更新类型化值。这不是很好,但很管用;-)酷,我真希望我能为你找到一个更好的答案,但至少你对这件事不感兴趣!
DECLARE @tmp_xml TABLE (id int identity, data xml)

INSERT INTO @tmp_xml (data)
VALUES ('<ns2:data xmlns:ns2="http://mynamespace">
  <OrderLineItems>
    <OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:DeactivationLineItem" id="1">
      <Product>
        <Id>5300</Id>
        <Description>DUMMY</Description>
        <Domain>ddd</Domain>
      </Product>
      <Quantity>1</Quantity>
    </OrderLineItem>
    <OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:ActivationLineItem" id="4">
      <Product>
        <Id>5340</Id>
        <Description>DUMMY</Description>
        <Domain>aaa</Domain>
      </Product>
      <Quantity>1</Quantity>
    </OrderLineItem>
    <OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:DeactivationLineItem" id="12">
      <Product>
        <Id>53200</Id>
        <Description>DUMMY</Description>
        <Domain>ccc</Domain>
      </Product>
      <Quantity>21</Quantity>
    </OrderLineItem>
  </OrderLineItems>
</ns2:data>')

;WITH XMLNAMESPACES('http://mynamespace' AS ns)
SELECT
OrderLineItemID                = ref.value('@id', 'int')
,OrderLineItemParentID          = ref.value('@parentId', 'int')
,ProductID                      = NULLIF(ref.query('Product/Id').value('.', 'varchar(255)'),'')
,ProductDescription             = NULLIF(ref.query('Product/Description').value('.', 'varchar(255)'),'')
,ProductDomain                  = NULLIF(ref.query('Product/Domain').value('.', 'varchar(255)'),'')
,ProductAdditionalInfo          = NULLIF(ref.query('Product/AdditionalInfo').value('.', 'varchar(255)'),'')
,Quantity                       = ref.query('Quantity').value('.', 'int')

,LineItemType                   = ref.value('@xsi:type','varchar(max)')                 

FROM @tmp_xml t
    CROSS APPLY data.nodes('/ns:data/OrderLineItems/OrderLineItem') R(ref)