有人可以就从XML列中提取某些值的最有效方法提供一些指导吗?我已经尝试在case语句中使用substring和charindex,但是它变得非常混乱并且不是最佳表现者。我原以为有一个XML函数可以更好地工作,但很难找到任何在线使用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提取的值不存在于其他XML中。
示例:
可能始终有Supplier="xxxx"
但不是SupplierInvoiceNumber="xxxx"
,其位置会有所不同。
但是为了论证,让我们说这个练习我只想拔出
Supplier="varchar"
&amp; SupplierInvoiceNumber="int"
全部谢谢:)
〜d
答案 0 :(得分: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>';
- 清洁
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