2016-12-14 107 views
0

請有人提供一些關於從XML列中提取某些值的最有效方法的指導嗎?我試過在case語句中使用子字符串和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。這只是一個例子,但有時候我想爲某些XML提取的值在別人中不存在。

例子:

有可能永遠是一個Supplier="xxxx"但不是SupplierInvoiceNumber="xxxx",它的位置會有所不同。

爲了討論各種情形,雖然,可以說這個練習,我只是想拔出

Supplier="varchar" & SupplierInvoiceNumber="int"

感謝所有:)

〜d

回答

1

你的XML錯過閉幕最終標籤...

我試過在case語句中使用子字符串和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 

--Lazy

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)')而這返回的意見,而不是。感謝您的快速反應! –