在xml列上加入表

时间:2009-02-27 20:05:22

标签: xml sql-server-2005

我在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

这有效,但我想知道这是否是最好的方法。

2 个答案:

答案 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然后将其分解为列有一定的价值;特别是跨越多行。