TSQL将MultiValued Reporting Services参数传递给动态SQL

时间:2009-04-03 03:14:14

标签: tsql reporting-services dynamic-sql multivalue

重复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吗?

3 个答案:

答案 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 +''')'