2012-04-18 91 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