可能重复:
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)
我想
答案 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子句。