2012-01-24 10 views
3

SELECT文の "現在の"ノードからxsi:type属性を読みたいと思います。 のXQuery構文「@ {ます。http:それはエラーがスローされますようT-SQLからxsi:typeを読み取る

;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です:次のように

<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文に見える:私のXMLは、このようになります// www.w3.org/2001/XMLSchema-instance}:typeは、」私は私がCROSSは適用され使用していない場合は、単一のタイプを読むことができていますので、それは奇妙である

がサポートされていません。

WITH XMLNAMESPACES ('http://mynamespace' as p) 
SELECT CAST(xmlFile as XML).value('(/p:data/OrderLineItems/OrderLineItem/@xsi:type)[1]','nvarchar(max)') 
from tTEMP_XMLTABLE; 

2番目のステートメントはSQL Server 2005で機能します。クロス適用を使用する場合、xsi:type属性を読み取る可能性はありますか?ヘルプ

+1

[この記事] [1]いくつかの助けになるかもしれません... [1]:http://stackoverflow.com/questions/2477237/how-to-select-the -value-of-the-xsitype-attribute-in-sql-server – mwigdahl

+0

ありがとうございますが、これは私が投稿した2番目のSQL文について説明しています。私はCrossApplyですべてのタイプを読む必要があります – merror

+0

面白いです。 "xmlFile"はどのようなタイプですか?私はxml型の変数に格納していれば、これをあなたのXML用に動作させることができました。 – mwigdahl

答えて

1

このため

おかげで(バージョンを指定していなかったので、私はそれはあなたが持っているものであるかどうかわからない)のSQL Server 2008 SP1には私のために働きました。私がここにあるように、xmlまたはxmlのコピーをuntyped 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) 
+0

ありがとう、これは動作します!しかし、私は型なしのXMLフィールドを使用することはできません。型付きXML(XSDスキーマの背後にある)でそれを使用する可能性はありますか? – merror

+0

その他の記事に基づいて、私はいいえと言うだろう。しかし、おそらく型付けされたXMLを型なしに変換する計算列を使用してテーブルのスキーマを拡張し、型抽出の目的でこれを使用できますか?バインドされたスキーマを必要とする操作には、型付きXML列を使用できます。 – mwigdahl

+0

ありがとうございました。私は現在、型付きXMLをすべての値に使用し、型付きXML列を持つtempTableを使用して型付き値を更新します。それはあまりいいことではありませんが、それはうまくいきます;-) – merror

関連する問題