将SSRS中的多个值参数传递给存储过程

时间:2014-06-10 11:09:02

标签: sql-server stored-procedures reporting-services sql-server-2012

我正在尝试将多值字符串参数传递给SQL Server 2012存储过程中的表类型参数。我将此代码粘贴到SSRS的数据集中:

DECLARE @mylist clinic_list_tbltype
INSERT @mylist(n) VALUES (@pm_ChooseClinics)
EXEC sp_Skillset_Summary_With_Callbacks_Report @mylist, @pm_ChooseInterval, @pm_StartDateTime, @pm_EndDateTime

clinic_list_tbltype是我用一个名为“n”的varchar(50)字段创建的表类型。我可以从SSMS o.k调用这个存储过程。像这样(它回来很快):

DECLARE @mylist clinic_list_tbltype
INSERT @mylist(n) VALUES ('clinicA'), ('clinicB')
EXEC sp_Skillset_Summary_With_Callbacks_Report  @mylist, 'Daily', '6/3/2014', '6/9/2014'

我只能在SSRS中运行一个诊所(但速度非常慢),但如果我尝试多次,则会出错,说明

  

INSERT语句中的列数少于指定的值   在Values子句中

。即使运行一个clnic它也可以运行,但与在SSMS中运行查询相比,它需要非常长的时间。比如2分钟对1秒。一定是因为我正在通过('clinicA','clinicB')而不是('clinicA'),''clinicB')。

怎么办?

2 个答案:

答案 0 :(得分:7)

对,我需要先给你一些背景。

当您允许SSRS参数选择多个值时,选择多个值会将逗号分隔的值字符串创建为一个字符串

  'value1,value2,value3'

要使用IN运算符检查字符串中的值,我们需要使用逗号连接的字符串,如下所示....

  'value1','value2','value3'

您的过程

现在在你的proc中,当你明确地插入值时,它会在你的表中插入多个值。

  INSERT INTO Table_Value_Param
  VALUES ('value1'),       --<-- 1st value/Row
         ('value2'),       --<-- 2nd Value/Row
         ('value3')        --<-- 3rd Value/Row

这会让你回到预期的结果,就像你在程序中执行像

这样的语句一样
SELECT * 
FROM Table_Name
WHERE ColumnName IN (SELECT ColumnName 
                     FROM Table_Value_Param)

另一方面,当您尝试使用SSRS报告参数插入表时,您的表将插入值,如

  INSERT INTO Table_Value_Param
  VALUES ('value1,value2,value3')   --<-- One Row/Value containing all the values comma separated

<强>解决方案

在这种情况下创建TVP并没有什么帮助,我所做的就是在我的程序中使用dbo.Split()函数。

您可以在线找到许多分割功能的定义,有些很酷的定义可以在这里查看Split Function equivalent in tsql?

一旦你创建了这个split函数,只需在你的过程定义中使用这个函数,你甚至不需要Table值参数。

像这样......

  SELECT * 
  FROM Table_Name 
  WHERE ColumnName IN ( 
                       SELECT Value
                       FROM dbo.Split(@Report_Param, ',')
                       ) 

答案 1 :(得分:0)

declare @Vendors_Filter nvarchar(max) = 'a,b,c'
declare @Vendors nvarchar(max) 
set @Vendors =''''+replace(@Vendors_Filter,',',''',''')+'''' 
select @Vendors