2016-12-14 66 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)')而这返回的意见,而不是。感谢您的快速反应! –