重复:TSQL varchar string manipulation
我正在使用报告服务报告中的参数构建动态SQL语句。报告服务以基本CSV格式传递MutiValue参数。例如,状态列表可以表示如下:AL,CA,NY,TN,VA
在SQL语句中,这没关系:
WHERE customerState In (@StateList)
但是,动态变体不正常:
SET @WhereClause1 = @WhereClause1 + 'AND customerState IN (' + @StateList + ') '
这是因为它转换为(无效的SQL):
AND customerState IN (AL,CA,NY,TN,VA)
要处理它需要这样的东西:
AND customerState IN ('AL','CA','NY','TN','VA')
我可以用一些很酷的表达式将单引号插入动态SQL吗?
答案 0 :(得分:2)
由于某些原因,当与IN一起使用时,REPLACE对我不起作用。我最终使用了CHARINDEX
WHERE CHARINDEX( ',' + customerState + ',', ',' + @StateList + ',' ) > 0
答案 1 :(得分:2)
对于任何试图在where子句中使用带有多值参数的动态SQL并使用它来运行SSRS报告的人来说,这就是我解决它的方法......
create table #temp
(id, FName varchar(100), LName varchar(100))
declare @sqlQuery (nvarchar(max))
set @sqlQuery =
'insert into #temp
select
id,
FName,
LName
from dbo.table'
exec (@sqlQuery)
select
FName, LName
from #temp
where #temp.id in (@id) -- @id being an SSRS parameter!
drop table #temp
当然,这个查询的问题是动态SQL将从dbo.table中选择所有内容,然后从#temp中选择是过滤器启动的位置,所以如果有大量数据 - 可能不是这样大。但是......我试图让REPLACE工作,或者其他人发布的任何其他解决方案,我感到很沮丧。
答案 2 :(得分:1)
这照顾中间:
SET @StateList = REPLACE(@ StateList,',',''',''')
然后引用边缘:
SET @ WhereClause1 = @ WhereClause1 +'AND customerState IN('''+ @StateList +''')'