在哪里使用局部变量

for*_*orX 1 sql sql-server sql-server-2005 where where-in

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

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

像这样的东西:

表XYZ

COL1 COL2
1    A
2    B
3    C
4    D
5    E
Run Code Online (Sandbox Code Playgroud)

结果

1 A
2 B
5 E
Run Code Online (Sandbox Code Playgroud)

QUERY

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

我该怎么做呢?

注意:我无法使用服务器功能

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

我的代码看起来像:

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

commandsql.returnresult(myQueryInString,mylist)
Run Code Online (Sandbox Code Playgroud)

我想要

Qua*_*noi 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
        )
Run Code Online (Sandbox Code Playgroud)

您还可以编写一个表值函数来拆分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)
        )
Run Code Online (Sandbox Code Playgroud)

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

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
        )
Run Code Online (Sandbox Code Playgroud)