2016-12-14 7 views
0

XML列からいくつかの値を抽出する最も効率的な方法についていくつかの指針を与えてください。私はcase文の中でsubstringとcharindexを使ってみましたが、これは本当に乱雑になり、最高のパフォーマーではありません。私はもっ​​とうまくいくが、XMLを使っている例をオンラインで見つけるのに苦労しているXML関数があると思っただろう。SQL ServerのXMLから値を抽出する

<pro:Import xmlns:pro="http://thenamespace/"> 
<pro:Control DatabaseName="varchar" UserName="varchar" Password="varchar" Company="varchar" Version="varchar" ErrorHandlingMode="varchar" /> 
<pro:Invoice RegisterInvoiceEvenIfParentOrdersAreInvalid="Bool" Tray="Varchar" Template="varchar" Supplier="varchar" SupplierInvoiceNumber="int" InvoiceDate="datetime" GrossValue="decimal" TaxValue="decimal" ImageReference="uniqueidentifier"> 
    <pro:References> 
     <pro:Reference Code="varchar" Value="datetime" /> 
     <pro:Reference Code="varchar" Value="varchar" /> 
    </pro:References> 
    <pro:ParentOrders> 
     <pro:ParentOrder OrderNumber="varchar" /> 
    </pro:ParentOrders> 
    <pro:TaxDetails> 
     <pro:Tax Band="varchar" Code="varchar" GrossValue="decimal" TaxValue="decimal" /> 
    </pro:TaxDetails> 
    <pro:Comments> 
     <pro:Comment>varchar</pro:Comment> 
    </pro:Comments> 
</pro:Invoice> 

私は抽出する値は、XMLがするように、変化します。これは1つの例ですが、いくつかのXMLのために抽出したい値が他のものに存在しないときがあります。

例:

あり、常にSupplier="xxxx"なくSupplierInvoiceNumber="xxxx"かもしれないし、その位置が異なります。引数の便宜上

しかし、私はちょうど

Supplier="varchar" & SupplierInvoiceNumber="int"

を引き出したい、この運動のために言うことができますおかげで、すべての:)

〜D

答えて

1

あなたのXMLは、閉鎖をミス最終タグ...

私はcase文の中でsubstringとcharindexを使ってみましたが、これは本当に乱雑になり、最高の実行者ではありません。これは、文字列レベルでのXMLから読み取るしようとする非常に悪い考えある

...

このようにそれを試してみてください。

DECLARE @xml XML= 
N'<pro:Import xmlns:pro="http://thenamespace/"> 
    <pro:Control DatabaseName="varchar" UserName="varchar" Password="varchar" Company="varchar" Version="varchar" ErrorHandlingMode="varchar" /> 
    <pro:Invoice RegisterInvoiceEvenIfParentOrdersAreInvalid="Bool" Tray="Varchar" Template="varchar" Supplier="varchar" SupplierInvoiceNumber="int" InvoiceDate="datetime" GrossValue="decimal" TaxValue="decimal" ImageReference="uniqueidentifier"> 
    <pro:References> 
     <pro:Reference Code="varchar" Value="datetime" /> 
     <pro:Reference Code="varchar" Value="varchar" /> 
    </pro:References> 
    <pro:ParentOrders> 
     <pro:ParentOrder OrderNumber="varchar" /> 
    </pro:ParentOrders> 
    <pro:TaxDetails> 
     <pro:Tax Band="varchar" Code="varchar" GrossValue="decimal" TaxValue="decimal" /> 
    </pro:TaxDetails> 
    <pro:Comments> 
     <pro:Comment>varchar</pro:Comment> 
    </pro:Comments> 
    </pro:Invoice> 
</pro:Import>'; 

--clean

WITH XMLNAMESPACES(DEFAULT 'http://thenamespace/') 
SELECT @xml.value('(/Import/Invoice/@Supplier)[1]','nvarchar(max)') AS Supplier 
     ,@xml.value('(/Import/Invoice/@SupplierInvoiceNumber)[1]','nvarchar(max)') AS SupplierInvoiceNumber 

- レイジー

SELECT @xml.value('(//@Supplier)[1]','nvarchar(max)') AS Supplier 
     ,@xml.value('(//@SupplierInvoiceNumber)[1]','nvarchar(max)') AS SupplierInvoiceNumber 
+0

完全に感謝します!私はxml.Valueで試してみましたが、私はオンラインで見つけたもの(/ ns:Import/ns:Invoice)[1] '、' varchar(max) ')を' Supplier '代わりにコメントが返されました。本当に迅速な対応に感謝します! –

関連する問題