我正在尝试使用动态参数复制水晶报告。如果我在参数屏幕中键入一个字符串并单击箭头按钮,它会将参数添加到列表中:
生成的查询如下所示,但列表可以使用其他OR @param
子句增长:
SELECT * FROM table_name WHERE @param LIKE 'cfe%' OR @param LIKE 'abr%'
如何在SSRS中创建一个包含多个参数的列表?以下查询是一个可能的示例:
SELECT * FROM table_name WHERE
@param LIKE 'cfe%'
OR @param LIKE 'abr%'
OR @param LIKE 'fez%'
OR @param LIKE 'zez%'
我尝试在参数中使用多个值,但是一旦我这样做,我就无法输入参数框:
我试过了this但是没有用。我也尝试使用CONTAINS
,但视图没有索引。
答案 0 :(得分:2)
您可以使用单个参数字符串。用户使用逗号分隔列表中的条目。查询得到了很大的改善,但我有一个可变数量的前缀与逗号分隔的例子。
我希望这会有所帮助。它不是那么简单或漂亮。
在数据集中,使用类似的查询或proc,它使用这样的参数,它应该起作用:
Declare @prefixes varchar(1000)
set @prefixes='abc,defg,efgh,hij,jkl,mno'
declare @sql nvarchar(max) = ''
declare @currentint int
set @currentint = 1
declare @maxint int
set @maxint = len(@prefixes) - len(replace(@prefixes, ',', '')) + 1
declare @currentcommaposition int
set @sql = 'IF OBJECT_ID(''tempdb..#tempTest'') IS NOT NULL DROP TABLE #tempTest
create table #tempTest
(
ID INT,
name varchar(100)
)
insert into #tempTest
(id,name)
select 1,''abcd''
union
select 2, ''defghijk''
union
select 3,''efghoot''
union
select 4,''hijack''
union
select 5,''jklmo''
union
select 6,''mnopoly''
union
select 7,''pqrstuv''
union
select 8,''tubool''
IF OBJECT_ID(''tempdb..#testresults'') IS NOT NULL DROP TABLE #testresults
create table #testresults
(
id int, name varchar(100)
)
declare @prefixes varchar(100) = ''' + @prefixes + ',''' + char(10) + ' declare @currentint int declare @maxint int = ' + convert(varchar(10),@maxint) + char(10)
while ( @currentint <= @maxint )
begin
set @sql = @sql + 'set @currentint = ' + convert(varchar(10),@currentint) + ' declare @suffix' + convert(varchar(2), @currentint) + ' VARCHAR(100)' + char(10)
+ 'set @suffix' + convert(varchar(2), @currentint) + '= substring(@prefixes,0,charindex('','',@prefixes))' + char(10)
+
'set @prefixes=Right(@prefixes,len(@prefixes)-charindex('','',@prefixes))' + char(10) +
'insert into #testresults (id, name)
select id, name from #temptest t where t.name like @suffix' + convert(varchar(2), @currentint) + ' + ''%''' + char(10)
+ 'if (@currentint = @maxint) begin select * from #testresults end ' + char(10)
set @currentint = @currentint + 1
end
exec sp_executesql @sql
答案 1 :(得分:1)
您的第二个选项是为用户可以回答的每个后缀提供参数,并允许它们为空或空为默认值。这将限制用户可以输入的前缀数量,但我认为您应该能够猜测用户输入的最大数量。或者用户可以多次运行报告,当他们这样做时,他们会导出到Excel,以便在需要时将报告混合在一起。
这对开发人员来说更容易理解,但为用户提供了更多的工作。
因此,在您的存储过程中,您将使用如下语句:
select *
from dbo.Test t
WHERE
( ISNULL(@Prefix1,'') <> '' AND t.TestName LIKE @Prefix1 + '%')
OR
( ISNULL(@Prefix2,'') <> '' AND t.TestName LIKE @Prefix2 + '%')
OR
( ISNULL(@Prefix3,'') <> '' AND t.TestName LIKE @Prefix3 + '%')
OR
( ISNULL(@Prefix4,'') <> '' AND t.TestName LIKE @Prefix4 + '%')
OR
( ISNULL(@Prefix5,'') <> '' AND t.TestName LIKE @Prefix5 + '%')
OR
( ISNULL(@Prefix6,'') <> '' AND t.TestName LIKE @Prefix6 + '%')
OR
( ISNULL(@Prefix7,'') <> '' AND t.TestName LIKE @Prefix7 + '%')
OR
( ISNULL(@Prefix8,'') <> '' AND t.TestName LIKE @Prefix8 + '%')
OR
( ISNULL(@Prefix9,'') <> '' AND t.TestName LIKE @Prefix9 + '%')
OR
( ISNULL(@Prefix10,'') <> '' AND t.TestName LIKE @Prefix10 + '%')