我正在使用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)
有什么建议吗?谢谢!
答案 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
如果您对此方法感兴趣,可以查找适当的拆分字符串函数的代码。