我想从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>
我的select语句如下所示:
;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 tTEMP_XMLTABLE
CROSS APPLY xmlFile.nodes('/ns:data/OrderLineItems/OrderLineItem') R(ref)
我的问题是LineItemType行,因为它抛出一个错误: 不支持XQuery语法“@ {http://www.w3.org/2001/XMLSchema-instance}:type”
很奇怪,因为如果我不使用CROSS APPLY,我可以阅读单一类型:
WITH XMLNAMESPACES ('http://mynamespace' as p)
SELECT CAST(xmlFile as XML).value('(/p:data/OrderLineItems/OrderLineItem/@xsi:type)[1]','nvarchar(max)')
from tTEMP_XMLTABLE;
第二个语句适用于SQL Server 2005.使用交叉应用时是否有可能读取xsi:type属性?
感谢您的帮助
答案 0 :(得分:1)
这在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)