我试图将多值字符串参数传递给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调用这个存储过程(它会很快恢复):
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').
怎么做?
对,我需要先给你一些背景.
当您允许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, ',') )