在SQL Server 2005中使用XQuery实现IN查询

时间:2011-08-19 13:41:28

标签: sql-server-2005 xquery-sql

我正在尝试使用IN表达式查询xml列。我没有找到一个本机XQuery方式来做这样的查询,所以我尝试了两种解决方法:

  1. 将IN查询实现为OR的串联,如下所示:

     WHERE Data.exist('/Document/ParentKTMNode[text() = sql:variable("@Param1368320145") or 
     text() = sql:variable("@Param2043685301") or ...
    
  2. 使用String fn:contains(...)方法实现IN查询,如下所示:

    WHERE Data.exist('/Document/Field2[fn:contains(sql:variable("@Param1412022317"), .)]') = 1
    
  3. 其中给定参数是(长)字符串,其值以“|”

    分隔

    问题是版本1不适用于超过50个参数。服务器抛出内存不足异常。版本2.工作,但非常非常慢。

    有没有人有想法?要使问题更加完整:给定任何sql本机类型的值列表,选择xml列在xml中的特定字段中具有给定值之一的所有行。

1 个答案:

答案 0 :(得分:1)

尝试使用 sql:column 子句将所有参数插入表中并进行查询:

SELECT Mytable.Column FROM MyTable
CROSS JOIN (SELECT '@Param1' T UNION ALL SELECT '@Param2') B
WHERE Data.exist('/Document/ParentKTMNode[text() = sql:column("T")