从SQL Server

时间:2016-12-14 08:53:41

标签: xml sql-server-2014

有人可以就从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

1 个答案:

答案 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