2016-10-03 134 views
1

我試圖用動態參數複製水晶報表。如果我輸入一個字符串到參數屏幕,然後單擊箭頭按鈕,將其添加的參數列表:動態添加WHERE條件

enter image description here

結果查詢看起來是這樣,但列表可以與附加OR @param條款成長:

SELECT * FROM table_name WHERE @param LIKE 'cfe%' OR @param LIKE 'abr%' 

如何在SSRS中創建一個類似於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,但沒有視圖的索引。

+0

喜@ 4444感謝我的編輯的問題,但答案始終是更好... –

+3

嗨安迪。我不知道你的問題的答案。我儘可能地改進和格式化了它,以吸引那些能*回答它的人。 – 4444

+1

有問題的鏈接不會吸引儘可能多的答案。你應該停止在「謝謝編輯我的問題」 – dazedandconfused

回答

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 
+0

嗨@Alwaysariyana,如果我不是在看後綴但是完整的字符串,它會工作。正如你所看到的,我使用了很多'LIKE'abr%''或者任何我需要的後綴 –

+0

你有一個已定義的最大前綴數量還是總是可變的? – JesalynOlson

+0

Hi @Alwaysariyana,總是可變的 –

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 + '%')