2012-04-18 100 views
1

可能重复:
Parameterizing an SQL IN clause?
SQL:Casting a String to IDS with IN clause与局部变量其中

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

事情是这样的:

表XYZ

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

结果

1 A 
2 B 
5 E 

QUERY

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

我该怎么办呢?

注: 我不能有一个服务器功能

我只能创建原始值(代码),并与我的查询中使用它。 我搜索一种方式,我只会改变我的变种而不是查询本身。

我的代码如下所示:

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

commandsql.returnresult(myQueryInString,mylist) 

我想

+0

坦克你bluefeet,我仍然有论坛模板 – forX 2012-04-18 18:51:18

+0

问题,我不能在数据库 – forX 2012-04-18 18:52:41

+1

创建一个函数没有它的SQL 2005 – forX 2012-04-18 18:53:00

回答

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 
     ) 
+0

和VAR应该在代码中设置,我只是有primitif类型。所以我不能在@var中推送X数值。 – forX 2012-04-18 18:56:27

0

你需要的分裂你的名单分成数据的功能设置(来自Jeff Moden的use this它的工作原理和速度非常快),然后在您所需的列上使用IN子句。

+0

我可以在服务器上创建一个功能 – forX 2012-04-18 19:33:10

+0

你可以在你的查询中在线运行代码,它将工作得一样。如果您不想全部阅读,请滚动至文章最底部。 – 2012-04-18 19:35:06