【问题标题】:TSQL Passing MultiValued Reporting Services Parameter into Dynamic SQLTSQL 将多值报告服务参数传递到动态 SQL
【发布时间】:2010-10-17 06:43:21
【问题描述】:

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

【问题讨论】:

    标签: tsql reporting-services dynamic-sql multivalue


    【解决方案1】:

    由于某种原因,与 IN 一起使用时,REPLACE 对我不起作用。我最终使用了CHARINDEX

    WHERE CHARINDEX( ',' + customerState + ',', ',' + @StateList + ',' ) > 0
    

    【讨论】:

      【解决方案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 工作或其他人发布的任何其他解决方案感到沮丧。

      【讨论】:

        【解决方案3】:

        这照顾了中间:

        SET @StateList = REPLACE(@StateList, ',', ''',''')

        然后引用边缘:

        SET @WhereClause1 = @WhereClause1 + 'AND customerState IN (''' + @StateList + ''')'

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多