1

可能重复:
参数化 SQL IN 子句?
SQL:使用 IN 子句将字符串转换为 IDS

我想在WHERE IN子句中使用声明局部变量

像这样的东西:

表 XYZ

COL1 COL2
1    A
2    B
3    C
4    D
5    E

结果

1 A
2 B
5 E

询问

DECLARE @VAR VARCHAR(MAX)
SET @VAR = '1,2,5'
SELECT * FROM XYZ WHERE COL1 IN @VAR

我该怎么做呢?

注意:我不能有服务器功能

我只能(通过代码)创建原始值并将其与我的查询一起使用。我搜索了一种方式,我只会更改我的 var 而不是查询本身。

我的代码看起来像:

list (dbparameter)
mylist.add ('@var','1,2,5')

commandsql.returnresult(myQueryInString,mylist)

我想要

4

2 回答 2

5
DECLARE @var TABLE
        (
        value INT
        )

INSERT
INTO    @var
VALUES
        (1), (3), (5)

/* You would need three separate inserts in 2005 */

SELECT  *
FROM    xyz
WHERE   col1 IN
        (
        SELECT  value
        FROM    @var
        )

您还可以编写一个拆分 a 的表值函数CSV,但如果您的客户端库支持传递表变量,这是首选选项。

您可以在Erlang Sommarskog 的文章中找到函数定义(搜索simple_intlist_to_tbl)。声明它并像这样调用:

DECLARE @var VARCHAR(100) = '1,3,5'

SELECT  *
FROM    xyz
WHERE   col1 IN
        (
        SELECT  number
        FROM    simple_intlist_to_tbl(@var)
        )

如果您的查询比这更复杂,您可能希望首先具体化此列表:

DECLARE @var VARCHAR(100) = '1,3,5'

DECLARE @tvar TABLE
        ( 
        number INT
        )

INSERT
INTO    @tvar
SELECT  number
FROM    simple_intlist_to_tbl(@var)

SELECT  *
FROM    xyz, ... /* Other complex joins */
WHERE   col1 IN
        (
        SELECT  number
        FROM    @tvar
        )
于 2012-04-18T18:50:56.783 回答
0

您需要一个将列表拆分为数据集的函数(从 Jeff Moden使用它,它可以工作并且非常快),然后只需在所需列上使用 IN 子句。

于 2012-04-18T19:31:29.033 回答