您如何阅读SQL Server 2008中的XML列?

use*_*969 15 xml sql sql-server-2008

我从未在SQL Server 2008中使用过XML,我需要将客户列表提取到变量表中,您是如何做到的?

鉴于我CustomerListSales表格中调用的列如下所示,如何在sql中提取客户列表?

<ArrayOfCustomers xmlns:xsd="http://www.w3.org/2001/XMLSchema"        
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <Customer>
       <ItemId>1</ItemId>
       <Value>Mr Smith</Value>
   </Customer>
   <Customer>
      <ItemId>2</ItemId>
      <Value>Mr Bloggs</Value>
   </Customer>
</ArrayOfCustomers>
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 22

尝试这样的事情:

SELECT
   Cust.value('(ItemId)[1]', 'int') AS 'ItemID',
   Cust.value('(Value)[1]', 'Varchar(50)') AS 'Customer Name'
FROM
   dbo.Sales.CustomerList.nodes('/ArrayOfCustomers/Customer') AS AOC(Cust)
Run Code Online (Sandbox Code Playgroud)

这应该给你一个像这样的输出:

ItemID  Customer Name
   1         Mr Smith
   2         Mr Bloggs
Run Code Online (Sandbox Code Playgroud)


Ric*_*iwi 21

您需要在表到XML列中使用CROSS APPLY

create table sales (customerlist xml)
insert sales select '
    <ArrayOfCustomers xmlns:xsd="http://www.w3.org/2001/XMLSchema"        
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <Customer>
           <ItemId>1</ItemId>
           <Value>Mr Smith</Value>
       </Customer>
       <Customer>
          <ItemId>2</ItemId>
          <Value>Mr Bloggs</Value>
       </Customer>
    </ArrayOfCustomers>'
Run Code Online (Sandbox Code Playgroud)

您的查询:

SELECT
   N.C.value('ItemId[1]', 'int') ItemId,
   N.C.value('Value[1]', 'varchar(100)') Value
FROM dbo.Sales
CROSS APPLY CustomerList.nodes('//Customer') N(C)
Run Code Online (Sandbox Code Playgroud)

编辑 - 注意
上面的查询是快速编写的,用于说明在表中使用xml列(多行).出于性能原因,请不要使用'// Customer',而是使用绝对路径代替'/ ArrayOfCustomers/Customer'.'// Customer'将遍历整个XML,以便Customer在任何级别的XML中的任何位置查找节点.

  • 这样可以工作 - 但是它非常慢,因为你使用的是`// Customer'符号 - 它很方便,但是表现糟糕......使用`.nodes(/ ArrayOfCustomers/Customer')`代替!快多了..... (2认同)