我在Sql Server 2005数据库上有以下两个表
Request(RequestId int, Filter xml)
DataTable(Id int,.....)
过滤列有一个来自数据表的id列表,例如xml,例如: 1013
现在我想从DataTable中选择与过滤器xml中的id匹配的数据。以下是我的想法
select d.*
from request
cross apply filter.nodes('Ids/Id') as Ids(id)
inner join DataTable d on d.id = Ids.Id.value('.', 'int')
where requestid = 35
这有效,但我想知道这是否是最好的方法。
答案 0 :(得分:1)
这是我如何进行类似的连接(从xml参数到表格)...如果有帮助。
它干净且易于理解
答案 1 :(得分:1)
这是我能够通过xml列从表的多行拉出连接的唯一方法。我使用的另一种方法是使用CTE将整个结果集合并到单个XML列中,并使用CTE的交叉应用。上面的例子是:
WITH tmpCTE AS
(
SELECT
(
SELECT
r.RequestID AS [requestid]
, r.Filter.query('//id') AS [id]
FROM Request AS r
FOR XML PATH('request'), TYPE, ROOT('root')
) AS tmpXML
)
SELECT d.*
FROM
tmpCTE AS tmp
CROSS APPLY tmpXML.nodes('Ids/Id') as Ids(id)
INNER JOIN DataTable AS d on d.id = Ids.Id.value('.', 'int')
WHERE
requestid = 35
;
它有点多余,但我认为将整个结果集分解为XML然后将其分解为列有一定的价值;特别是跨越多行。