Sql server 2005 在MSSQLServer2005中使用XQuery实现IN查询

Sql server 2005 在MSSQLServer2005中使用XQuery实现IN查询,sql-server-2005,xquery-sql,Sql Server 2005,Xquery Sql,我正在尝试使用IN表达式查询xml列。我还没有找到执行此类查询的原生XQuery方法,因此我尝试了两种解决方法: 将IN查询实现为ORs的串联,如下所示: WHERE Data.exist('/Document/ParentKTMNode[text() = sql:variable("@Param1368320145") or text() = sql:variable("@Param2043685301") or ... WHERE Data.exist('/Document/Fiel

我正在尝试使用IN表达式查询xml列。我还没有找到执行此类查询的原生XQuery方法,因此我尝试了两种解决方法:

  • 将IN查询实现为ORs的串联,如下所示:

     WHERE Data.exist('/Document/ParentKTMNode[text() = sql:variable("@Param1368320145") or 
     text() = sql:variable("@Param2043685301") or ...
    
    WHERE Data.exist('/Document/Field2[fn:contains(sql:variable("@Param1412022317"), .)]') = 1
    
  • 使用字符串fn:contains(…)方法实现IN查询,如下所示:

     WHERE Data.exist('/Document/ParentKTMNode[text() = sql:variable("@Param1368320145") or 
     text() = sql:variable("@Param2043685301") or ...
    
    WHERE Data.exist('/Document/Field2[fn:contains(sql:variable("@Param1412022317"), .)]') = 1
    
  • 其中,给定参数是一个(长)字符串,其值由“|”分隔

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


    有人有3分吗。主意要更完整地表述这个问题:给定一个任何sql本机类型的值列表,请选择其xml列在xml中的特定字段处具有给定值之一的所有行

    尝试在表中插入所有参数,并使用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") 
    

    这是一个有趣的想法。在我的测试中,查询速度非常快。我不知道我是否能实现它,因为它需要一个真正的表,我需要以某种方式插入我首先要寻找的键。我不知道,这是否符合我已经得到的代码。但看起来,这绝对是一条路要走。