我从未在SQL Server 2008中使用XML,我需要将客户列表提取到变量表中,您是如何做到的?
鉴于我在CustomerList
表中有一个名为Sales
的列,如下所示,如何在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>
答案 0 :(得分:21)
尝试这样的事情:
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)
那应该给你一个像这样的输出:
ItemID Customer Name
1 Mr Smith
2 Mr Bloggs
答案 1 :(得分:20)
您需要在表格到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>'
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)
编辑 - 注意
上面的查询是为了说明在表中使用xml列(多行)而快速编写的。出于性能原因,请不要使用'// Customer',而是使用绝对路径代替'/ ArrayOfCustomers / Customer'。 '// Customer'将遍历整个XML,在任何级别的XML中的任何位置查找Customer
个节点。
答案 2 :(得分:-1)
尝试此查询:
SELECT AccountDetail.value('(/Accounts/Account/AccountNumber)[1]', 'varchar(100)') AS AccountNumber,
AccountDetail.value('(/Accounts/Account/PayeeName)[1]', 'varchar(1000)') AS PayeeName,
AccountDetail.value('(/Accounts/Account/Amount)[1]', 'decimal(20,2)') AS Amount
FROM [dbo].[AccountDetails]