您可以为要创建的任何报表参数定义多值参数。不过,如果要将多个参数值传回查询,则必须满足下列要求:
- 数据源必须为 SQL Server、Oracle 或 Analysis Services。
- 数据源不能是存储过程。Reporting Services 不支持将多值参数数组传递给存储过程。
- 查询必须使用 IN 子句来指定参数。
在表达式中引用参数时,使用全局集合参数。在表达式中使用多值参数时,既需要了解如何处理单个值也需要了解如何处理整组值。下表为设置“多值”选项的参数提供了有关参数属性的示例和说明。
示例 | 说明 |
---|---|
Parameters! <ParameterName> .Value | 该参数的一组变量数据值。 |
Parameters! <ParameterName> .Label | 一组用作该参数标签的字符串。 |
Parameters! <ParameterName> .IsMultiValue | 表明是否已选择参数“多值”选项的布尔值属性。 |
Parameters! <ParameterName> .Count | 数组中值的数量。 |
Parameters! <ParameterName> .Value(0) | 多值数组中的第一个值。 |
Parameters! <ParameterName> .Label(0) | 多值数组中的第一个标签。 |
Parameters! <ParameterName> .Value(Parameters! <ParameterName>.Count-1) | 多值数组中最后一个值。 |
Parameters! <ParameterName> .Label(Parameters! <ParameterName>.Count-1) | 多值数组中最后一个标签。 |
=Join(Parameters! <ParameterName> .Value,", ") | 该表达式将 String 类型多值参数数组中的所有值连接为一个字符串。 |
=Split("Value1, Value2, Value3",",") | 接收一个字符串并创建一组对象,这些对象可以被传递到需要多值参数的子报表和钻取报表。 |
把多值参数所有 值连接为一个字符串的形式进行传值
设置参数值为:
=Join(Parameters! <ParameterName> .Value,", ")
一、场景说明:
1、报表需要对同一个参数同时输入多个值进行查询
2、报表参数:字符串格式;参数的每个值之间以特定的符号隔开,以下以逗号(,)为示例进行
二、存储过程调用实现
1、必备函数
GO
CREATE function Get_StrArrayLength ( @str varchar(1024), --要分割的字符串
@split varchar(10) --分隔符号 )
returns int
as begin
declare @location int
declare @start int
declare @length int
set @str=ltrim(rtrim(@str))
set @location=charindex(@split,@str)
set @length=1 while @location<>0
begin
set @start=@location+1
set @location=charindex(@split,@str,@start)
set @length=@length+1
end
return @length
end
--调用示例:
select dbo.Get_StrArrayLength('6,5,9,3',',')--返回值:4
GO
CREATE function Get_StrArrayStrOfIndex ( @str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符号
@index int --取第几个元素 )
returns varchar(1024)
as begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location<>0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end if @location =0
select @location =len(@str)+1 --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
return substring(@str,@start,@location-@start) end
--调用示例:
select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2) --返回值:9
GO
create function f_splitstr --alter function f_splitstr
( @SourceSql varchar(8000), @StrSeprate varchar(100) )
returns varchar(8000)
as begin
declare @temp as varchar(8000)=''
declare @ch as varchar(100)
set @SourceSql=@SourceSql+@StrSeprate
while(@SourceSql<>'')
begin
set @ch=left(@SourceSql,charindex(',',@SourceSql,1)-1)
set @temp = @temp + ''''+@ch+'''' + ','
set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'')
end
return substring(@temp,0,len(@temp))
end
------调用 -- select [dbo].[f_splitstr]('1,2,3,4',',') -- 结果:'1','2','3','4'
2、存储过程里调用函数的方法
调用函数
declare @sql varchar(5000) = 'select * from #t1 AS A where 1=1 '
if(dbo.fn_isEmpty(@MOLotCode) = 0)
set @sql += ' and A.MOLotCode in( '+ [dbo].[f_splitstr](@MOLotCode,',') +')'
if(dbo.fn_isEmpty(@modocNo) = 0)
set @sql += ' and A.MODocNo in ( '+ [dbo].[f_splitstr](@modocNo,',') +')'
其中@MOLotCode和@modocNo是存储过程传入的参数,格式为:1,2,3,4,5
通过函数f_splitstr解析之后将得到: '1','2','3','4','5' 的格式
您可以为要创建的任何报表参数定义多值参数。不过,如果要将多个参数值传回查询,则必须满足下列要求:
- 数据源必须为 SQL Server、Oracle 或 Analysis Services。
- 数据源不能是存储过程。Reporting Services 不支持将多值参数数组传递给存储过程。
- 查询必须使用 IN 子句来指定参数。
在表达式中引用参数时,使用全局集合参数。在表达式中使用多值参数时,既需要了解如何处理单个值也需要了解如何处理整组值。下表为设置“多值”选项的参数提供了有关参数属性的示例和说明。
示例 | 说明 |
---|---|
Parameters! <ParameterName> .Value | 该参数的一组变量数据值。 |
Parameters! <ParameterName> .Label | 一组用作该参数标签的字符串。 |
Parameters! <ParameterName> .IsMultiValue | 表明是否已选择参数“多值”选项的布尔值属性。 |
Parameters! <ParameterName> .Count | 数组中值的数量。 |
Parameters! <ParameterName> .Value(0) | 多值数组中的第一个值。 |
Parameters! <ParameterName> .Label(0) | 多值数组中的第一个标签。 |
Parameters! <ParameterName> .Value(Parameters! <ParameterName>.Count-1) | 多值数组中最后一个值。 |
Parameters! <ParameterName> .Label(Parameters! <ParameterName>.Count-1) | 多值数组中最后一个标签。 |
=Join(Parameters! <ParameterName> .Value,", ") | 该表达式将 String 类型多值参数数组中的所有值连接为一个字符串。 |
=Split("Value1, Value2, Value3",",") | 接收一个字符串并创建一组对象,这些对象可以被传递到需要多值参数的子报表和钻取报表。 |
把多值参数所有 值连接为一个字符串的形式进行传值
设置参数值为:
=Join(Parameters! <ParameterName> .Value,", ")
一、场景说明:
1、报表需要对同一个参数同时输入多个值进行查询
2、报表参数:字符串格式;参数的每个值之间以特定的符号隔开,以下以逗号(,)为示例进行
二、存储过程调用实现
1、必备函数
GO
CREATE function Get_StrArrayLength ( @str varchar(1024), --要分割的字符串
@split varchar(10) --分隔符号 )
returns int
as begin
declare @location int
declare @start int
declare @length int
set @str=ltrim(rtrim(@str))
set @location=charindex(@split,@str)
set @length=1 while @location<>0
begin
set @start=@location+1
set @location=charindex(@split,@str,@start)
set @length=@length+1
end
return @length
end
--调用示例:
select dbo.Get_StrArrayLength('6,5,9,3',',')--返回值:4
GO
CREATE function Get_StrArrayStrOfIndex ( @str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符号
@index int --取第几个元素 )
returns varchar(1024)
as begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location<>0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end if @location =0
select @location =len(@str)+1 --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
return substring(@str,@start,@location-@start) end
--调用示例:
select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2) --返回值:9
GO
create function f_splitstr --alter function f_splitstr
( @SourceSql varchar(8000), @StrSeprate varchar(100) )
returns varchar(8000)
as begin
declare @temp as varchar(8000)=''
declare @ch as varchar(100)
set @SourceSql=@SourceSql+@StrSeprate
while(@SourceSql<>'')
begin
set @ch=left(@SourceSql,charindex(',',@SourceSql,1)-1)
set @temp = @temp + ''''+@ch+'''' + ','
set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'')
end
return substring(@temp,0,len(@temp))
end
------调用 -- select [dbo].[f_splitstr]('1,2,3,4',',') -- 结果:'1','2','3','4'
2、存储过程里调用函数的方法
调用函数
declare @sql varchar(5000) = 'select * from #t1 AS A where 1=1 '
if(dbo.fn_isEmpty(@MOLotCode) = 0)
set @sql += ' and A.MOLotCode in( '+ [dbo].[f_splitstr](@MOLotCode,',') +')'
if(dbo.fn_isEmpty(@modocNo) = 0)
set @sql += ' and A.MODocNo in ( '+ [dbo].[f_splitstr](@modocNo,',') +')'
其中@MOLotCode和@modocNo是存储过程传入的参数,格式为:1,2,3,4,5
通过函数f_splitstr解析之后将得到: '1','2','3','4','5' 的格式