报表参数多个值的接收及存储过程解析

若要为参数设置多值属性,则在 “报表参数”对话框上选择 “多值”选项。可以将任何参数类型设置为多值(除布尔值之外)。

您可以为要创建的任何报表参数定义多值参数。不过,如果要将多个参数值传回查询,则必须满足下列要求:

  • 数据源必须为 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' 的格式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值