2017-02-09 35 views
1

SSRS數據集有兩個T-SQL查詢。一個查詢只有在某個參數選擇了兩個或更多個值時纔會運行。另一個查詢只會在參數只有一個值被選中時運行。如何讓數據集知道從參數中選擇了一個值還是多個值?SSRS報告 - 多選擇定義多個查詢

+1

您可以創建一個addional整數參數,將其設置爲隱藏**和**使用表達式像這樣爲默認值:!'參數YourMultipleValueParam.Value.Count'然後在數據集可以使用hidden參數來確定'YourMultipleValueParam'參數中選擇的值的數量。 –

+0

好的,我要在主數據集中寫什麼來定義要使用哪個查詢?會像IF(@YourMultipleValueParam> 1)和(@YourMultipleValueParam = 1)的罰款? –

+0

我的意思是你有兩個在SSRS中創建一個額外的隱藏參數,並使用它將所選值的數量傳遞給數據集。因此,如果您將隱藏參數命名爲「NumberOfValues」,則應在SQL中使用「IF(@NumberOfValues> 1)」。 –

回答

2

可以創建名爲NumberOfValues的addional整數參數,將其設置爲hidden,並在使用表達式,如下面默認值:

=Parameter!YourMultipleValueParam.Value.Count 

然後在數據集可以使用NumberOfValues參數來確定YourMultipleValueParam參數選擇的值的數量。

IF @NumberOfValues > 1 BEGIN .... 
0

好問題。這是我發現的一種方法。

第1步:在您的數據集屬性中,轉到「參數」選項卡。使用以下表達式添加參數,用您的參數名稱替換MyParameterName

=join(Parameters!MyParameterName.Value,",") 

第2步:如果你不已經有一個,增加一個分流的功能,以您的SQL Server的功能。簡單的谷歌搜索將引導您到這樣的事情:Split function equivalent in T-SQL?

步驟3:選擇在你的SSRS報告中使用的參數計數。根據這個結果,做什麼是需要的:(我劃分功能簡稱爲分體式)

IF (select count(*) from Devl.dbo.Split(@MyParameterName,',')) = 1 
BEGIN 
    /* Do your second query here, when one parameter is selected */ 
END 
IF (select count(*) from Devl.dbo.Split(@MyParameterName,',')) > 1 
BEGIN 
    /* Do your first query here, when more than one parameter is selected */ 
END 

編輯:替代步驟2和3,如果你不希望(或不能)創建/利用分割功能。

步驟2:在頂部的主查詢,包括以下(基本上直列版本分割功能的)

declare @string varchar(max), @delimiter char(1) 
declare @temptable table (items varchar(max)) 

set @string = @MyParameterName 
set @delimiter = ',' 
declare @idx int, @slice varchar(max) 
select @idx = 1  
if len(@String)<1 or @String is null return  

while @idx!= 0  
begin  
    set @idx = charindex(@Delimiter,@String)  
    if @idx!=0  
     set @slice = left(@String,@idx - 1)  
    else  
     set @slice = @String  

    if(len(@slice)>0) 
     insert into @temptable(Items) values(@slice)  

    set @String = right(@String,len(@String) - @idx)  
    if len(@String) = 0 break  
end 

步驟3:選擇的參數的計在您的SSRS報告中使用。根據這個結果,做什麼是需要的:(我劃分功能簡稱爲分體式)

IF (select count(*) from @temptable) = 1 
BEGIN 
    /* Do your second query here, when one parameter is selected */ 
END 
IF (select count(*) from @temptable) > 1 
BEGIN 
    /* Do your first query here, when more than one parameter is selected */ 
END 
+0

我瞭解除分割功能以外的所有內容。我在哪裏編寫函數?是否將它添加到主數據集(帶有兩個查詢的數據集),參數的數據集中,還是將它放入新的數據集中? –

+0

不是,它是一個函數(https://msdn.microsoft.com/en-us/library/ms186755.aspx)被添加到數據庫(認爲SSMS,而不是通過報告服務)。一旦它在數據庫中,您可以在查詢中使用它。如果您無權將其添加到數據庫中,我將修改步驟2以包含一個內嵌解決方案,您只需將其添加到查詢頂部即可。 –

+0

雖然Matt H的解決方案沒有錯,但我會選擇Alejandro的解決方案,因爲它使用SSRS函數來確定所選參數值的數量。一旦添加了Alejandro建議的參數,在數據集中,您可以簡單地編輯數據集以讀取IF @MyNewParameter> 1 BEGIN ....您的多值查詢... END ELSE。開始您的單個值查詢END。 (道歉缺少換行符) –