为IN子句声明一个字符串

时间:2014-08-26 21:43:12

标签: sql sql-server-2008

我正在使用SQL Server 2008.有没有办法声明一个字符串,其中包含我将在where语句中用于IN的值。

假设我在下面有这个工作查询,这将产生colname = a,b或c的记录。

Select * 
from Table1 
where colname IN ('a', 'b', 'c')

我想要做的是在变量中声明这个列值并在IN子句中使用它。

Declare @StrCols varchar(MAX)
SET @StrCols = 'a', 'b', 'c'  --- Of course, this is not working.

-- Then the query would be:
Select * from Table1 where colname IN (@StrCols)

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:2)

尝试使用动态SQL和/或将其放入过程

示例:

Set @query ='SELECT * FROM [A] WHERE colname IN ('+@StrCols+')'

EXEC dbo.proc1 @query

答案 1 :(得分:2)

唉,不容易。您可以执行以下操作之一。

如果您不关心性能,可以使用

where ','+@strvals+',' like '%,' + colname + ',%'

如果要使SQL更复杂,可以执行以下操作:

with strvals as (
      select 'a' as val union al select 'b' union all select 'c'
     )
. . .
where colname in (select val from strvals)

您可以使用动态SQL将值放入字符串中:

declare @sql nvarchar(max) = 'select . . . where colname in (' + @strvals + ')';

exec sp_executesql @sql;

你可以用递归的CTE做一些奇特的东西来分割字符串函数(唉,不是内置的)。拆分字符串看起来像:

select . . . 
from . . . t cross apply
     dbo.splitstring('a,b,c', ',') ss
where t.colname = ss.value

如果您对此方法感兴趣,可以查找适当的拆分字符串函数的代码。