使用XQuery从sql server XML列中提取适当的数据

时间:2014-05-19 11:57:30

标签: sql xml xquery-sql

我在尝试从XML类型列中获取正确的数据时遇到问题:

"<"ArrayOfAccountInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.Balance.com/">
  "<"AccountInformation>
    "<"AccountNumber xmlns="https://Safouenmzah.com/">0100000000"<"/AccountNumber>
     "<"OutstandingAmount xmlns="https://Safouenmzah.com/">-909.55"<"/OutstandingAmount>
     "<"LastBilledAmount xmlns="https://Safouenmzah.com/" />
     "<"LastPaidDate xmlns="https://Safouenmzah.com/" />
    "<"Severance xmlns="https://Safouenmzah.com/" />
   "<"PaymentAmount xmlns="https://Safouenmzah.com/" />
    "<"DistributedAmount xmlns="https://Safouenmzah.com/">$"<"/DistributedAmount>
   "<"AccountInfo xmlns="https://Safouenmzah.com/">Safouen Mzah  - Residential"<"/AccountInfo>
 "<"/AccountInformation>
"<"/ArrayOfAccountInformation>

我正在使用这个sql代码:

;WITH XMLNAMESPACES ('http://www.Balance.com/' AS ns)
SELECT xmlResult.value('(/ns:ArrayOfAccountInformation)[1]','varchar(8000)') AS AcctInfo

FROM [dbo].[BalanceEnquiry_Transactions_Tracker]
WHERE BanlanceEnquiry_Transc_ID = 4
GO

This the result I am receiving always:
0100000000-909.55AEDSafouen Mzah  - Residential

This is the expected result:
0100000000

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

最后我明白了。

declare  @XML XML;


set @XML = '
"<"ArrayOfAccountInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.Balance.com/">
"<"AccountInformation>
"<"AccountNumber xmlns="https://Safouenmzah.com/">0100000000"<"/AccountNumber>
 "<"OutstandingAmount xmlns="https://Safouenmzah.com/">-909.55"<"/OutstandingAmount>
 "<"LastBilledAmount xmlns="https://Safouenmzah.com/" />
 "<"LastPaidDate xmlns="https://Safouenmzah.com/" />
"<"Severance xmlns="https://Safouenmzah.com/" />
"<"PaymentAmount xmlns="https://Safouenmzah.com/" />
"<"DistributedAmount xmlns="https://Safouenmzah.com/">$"<"/DistributedAmount>
"<"AccountInfo xmlns="https://Safouenmzah.com/">Safouen Mzah  - Residential"    <"/AccountInfo>
"<"/AccountInformation>
"<"AccountInformation>
"<"AccountNumber xmlns="https://Safouenmzah.com/">0200000000"<"/AccountNumber>
 "<"OutstandingAmount xmlns="https://Safouenmzah.com/">-908.55"<"/OutstandingAmount>
 "<"LastBilledAmount xmlns="https://Safouenmzah.com/" />
 "<"LastPaidDate xmlns="https://Safouenmzah.com/" />
"<"Severance xmlns="https://Safouenmzah.com/" />
"<"PaymentAmount xmlns="https://Safouenmzah.com/" />
"<"DistributedAmount xmlns="https://Safouenmzah.com/">$"<"/DistributedAmount>
"<"AccountInfo xmlns="https://Safouenmzah.com/">Safouen Mzah  - Expat"<"/AccountInfo>
"<"/AccountInformation>
"<"/ArrayOfAccountInformation>
'

;WITH XMLNAMESPACES ('http://www.Balance.com/' AS ns)
-- To get the outstanding amount of the first Account from the returned array
SELECT @XML.value('(/*[1]/*[1]/*[2])', 'varchar(200)') As OutstandingAmount1
-- To get the outstanding amount of the second Account from the returned array
SELECT @XML.value('(/*[1]/*[2]/*[2])', 'varchar(200)') As OutstandingAmount2

OutstandingAmount1
-909.55
OutstandingAmount2
-908.55

答案 1 :(得分:0)

您可以使用nodes()粉碎XML并在一个结果集中获取值。

with xmlnamespaces('https://Safouenmzah.com/' as ns,
                   default 'http://www.Balance.com/')
select T.X.value('(ns:OutstandingAmount/text())[1]', 'varchar(200)')
from @XML.nodes('/ArrayOfAccountInformation/AccountInformation') as T(X)

SQL Fiddle