在哪里使用局部变量

时间:2012-04-18 18:48:17

标签: sql sql-server sql-server-2005 where where-in

  

可能重复:
  Parameterizing an SQL IN clause?
  SQL:Casting a String to IDS with IN clause

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

这样的事情:

TABLE XYZ

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

RESULT

1 A
2 B
5 E

QUERY

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)

我想

2 个答案:

答案 0 :(得分: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
        )

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

您可以在Erlang Sommarskog's article(搜索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
        )

答案 1 :(得分:0)

你需要一个函数将你的列表拆分成一个数据集(来自Jeff Moden的use this它工作且非常快)然后只需在你想要的列上使用IN子句。