基于SQL中的列值查询XML

时间:2017-02-13 09:08:04

标签: sql sql-server xml sql-server-2008

我想根据SQL中的列值查询XML。

我的XML如下

declare @xmlValue xml = 
'<Accounts>
 <Account>
    <ID>1</ID>
    <Name>Alex</Name>
    <Age>10</Age>
  </Account>
  <Account>
    <ID>2</ID>
    <Name>Richard</Name>
    <Age>12</Age>
  </Account>
  <Account>
    <ID>3</ID>
    <Name>Shane</Name>
    <Age>15</Age>
  </Account>
</Accounts>';

现在我知道我可以在Id上查询XML,如果我有这样的常量Id:

select @xmlValue.query('/Accounts[1]/Account[./ID/text()="2"]');

另外,我可以使用下面的sql:variable,以防我有变量:

declare @ID int
set @ID = 1
select @xmlValue.query('/Accounts[1]/Account[./ID/text()=sql:variable("@ID")]');

现在,我有一个带有xml列的表#tmpTable(名为xmlValue)。 我想查询#tmpTable并加入Account表并从那里获取AccountId,有点像这样:

-- This does not work
select xmlValue.query('/Accounts[1]/Account[./ID/text()=a.AccountId]') as XMLResult 
from #tmpTable tmp
inner join Accounts a on tmp.Id = a.Id
where a.Active = 1 

我怎样才能做到这一点?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

试试这样:

select xmlValue.query('/Accounts[1]/Account[./ID/text()=sql:column("a.AccountId")]') as XMLResult 
from #tmpTable tmp
inner join Accounts a on tmp.Id = a.Id
where a.Active = 1 

sql:column() - 与sql:variable()类似 - 将列值引入XQuery

的适当方法