动态添加WHERE条件

时间:2016-10-03 13:51:07

标签: sql-server reporting-services crystal-reports

我正在尝试使用动态参数复制水晶报告。如果我在参数屏幕中键入一个字符串并单击箭头按钮,它会将参数添加到列表中:

enter image description here

生成的查询如下所示,但列表可以使用其他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%'

我尝试在参数中使用多个值,但是一旦我这样做,我就无法输入参数框:

enter image description here

我试过了this但是没有用。我也尝试使用CONTAINS,但视图没有索引。

2 个答案:

答案 0 :(得分:2)

您可以使用单个参数字符串。用户使用逗号分隔列表中的条目。查询得到了很大的改善,但我有一个可变数量的前缀与逗号分隔的例子。

我希望这会有所帮助。它不是那么简单或漂亮。

Parameter Test

在数据集中,使用类似的查询或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 + '%')