我正在尝试将多值字符串参数传递给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')。
怎么办?
答案 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