在网上见有兄弟说过这么一句话:
增加一个“内部”参数,将其设置为级联参数(必须排列在上面提到的多值参数之后),如@InnerOrderIDs类型为String,可用值和默认值都设置为表达式如下:
=Join(Parameters!OrderID.Value, ", ")
然后修改获取数据的SQL为 exec dbo.pGetOrders @InnerOrderIDs就大功告成!
这个方法我试了是可行的。但这只是第一步。
接下来看第二步:
为了接收这个多值参数,要创建一个表值函数,返回一个包含2列的表,主要用于解析多值参数并将其拆分(根据分隔符,号)。
CREATE FUNCTION [dbo].[StringToArrayTableForThree]
(
@string nvarchar(100), @spliter nchar(1) = N','
)
RETURNS @arrayTable TABLE (
[Index] int NULL,
[Value] nvarchar(64)
)
AS
BEGIN
DECLARE @i int ,@index int,@value nvarchar(64),@word nchar(1)
SET @i= 1
set @index = 1
set @value = N''
WHILE (@i <= LEN(@string))
BEGIN
SET @word = SUBSTRING(@string, @i, 1)
IF (@word = @spliter)
BEGIN
INSERT INTO @arrayTable([Index], [Value]) VALUES(@index, @value)
SET @value = N''
SET @index = @index + 1
END
ELSE
BEGIN
SET @value = @value + @word
END
SET @i = @i + 1
END
INSERT INTO @arrayTable([Index], [Value]) VALUES(@index, @value)
RETURN
END
GO
函数做完后,再看第三步:
第三步就是创建存储过程,在需要判断参数的地方使用刚才建的函数就行了,因为函数的返回值是table,所以要用子查询。
and vc_questionary_no in (SELECT [Value] FROM dbo.StringToArrayTableForThree(@no, N',')
执行完上述3步后就可以执行报表展示数据了。