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

urb*_*ojo 10 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
Run Code Online (Sandbox Code Playgroud)

clinic_list_tbltype是我用一个名为"n"的varchar(50)字段创建的表类型.我可以像这样从SSMS调用这个存储过程(它会很快恢复):

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'
Run Code Online (Sandbox Code Playgroud)

我只能在SSRS中运行一个诊所(但速度非常慢),但如果我尝试不止一个,就会出错

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

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

怎么做?

M.A*_*Ali 7

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

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

  'value1,value2,value3'
Run Code Online (Sandbox Code Playgroud)

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

  'value1','value2','value3'
Run Code Online (Sandbox Code Playgroud)

你的过程

现在在您的proc中,当您显式插入值时,它会在表中插入多个值.

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

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

SELECT * 
FROM Table_Name
WHERE ColumnName IN (SELECT ColumnName 
                     FROM Table_Value_Param)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

像这样......

  SELECT * 
  FROM Table_Name 
  WHERE ColumnName IN ( 
                       SELECT Value
                       FROM dbo.Split(@Report_Param, ',')
                       ) 
Run Code Online (Sandbox Code Playgroud)

  • 我会看一下,谢谢.您确定SSRS会将多值参数作为'value1,value2,value3'传递吗?我希望这两个和'value1','value2','value3'不正确,并给出错误"......更少的列......等等".我希望它是后者.如果它是前者我会期望它运行,但不会带回任何数据. (3认同)