2013-04-09 45 views
6

我有一個在SQL中工作得很好的查詢。當我嘗試將其引入SSRS時,報告要求提供4個參數。參數/變量的兩個實際上是基於兩個其他參數,例如:SSRS - 在我的查詢中忽略SQL變量

DECLARE @Q int  --SET @Q = 1 -- Quarter 
DECLARE @Year int --SET @Year = 2013 

DECLARE @STARTDATE varchar(10) 
SELECT @STARTDATE = D FROM (
    select case @Q 
     when 1 then '1/1/' + convert(varchar(10),@Year) 
     when 2 then '4/1/' + convert(varchar(10),@Year) 
     when 3 then '7/1/' + convert(varchar(10),@Year) 
     when 4 then '10/1/' + convert(varchar(10),@Year) 
    end as D 
    ) sd 

DECLARE @ENDDATE varchar(10) 
SELECT @ENDDATE = D FROM (
    select case @Q 
     when 1 then '3/31/' + convert(varchar(10),@Year) 
     when 2 then '6/30/' + convert(varchar(10),@Year) 
     when 3 then '9/30/' + convert(varchar(10),@Year) 
     when 4 then '12/31/' + convert(varchar(10),@Year) 
    end as D 
    ) ed 

--(ADDITIONAL SQL CONTINUES USING ALL 4 PARAMETERS) ... 

我怎樣才能得到SSRS只要求前兩個參數(@Q@Year)而忽略了@StartDate@EndDate那些在查詢內計算?

回答

-1

我不認爲這是可能的,因爲SSRS創建一個dynamic查詢和所有的變量轉換爲參數。所以據我所知的唯一的選擇就是包裹查詢在stored procedure

+0

downvoter照顧對此有何評論? – praveen 2013-04-09 18:56:44

+1

對不起,但我相信你錯了。我經常在SSRS中的SQL查詢中有變量,這些變量不是Stored Procs。 – 2013-04-09 18:57:30

+0

當你在查詢中使用'@'符號時,我不這麼認爲。你可以給我看一個這樣的查詢嗎? – praveen 2013-04-09 18:58:26

0

你把你的查詢到存儲過程? (你應該如果你不是,這只是一個好習慣)。如果你使用一個proc,你可以只有兩個輸入變量,然後根據需要聲明許多其他內部變量。

+0

我沒有打算創建一個存儲過程,但會如果我需要。 – ajspacemanspiff 2013-04-09 19:01:35

+0

@ajspacemanspiff:這是最好的做法。特別是當你想開始搜索你的數據庫時(比如是否使用某個表?),如果它在數據庫端更容易搜索這些東西。 – Limey 2013-04-09 19:03:48

+0

在報表中留下查詢通常是可取的:報表可以從測試到生產獨立提升,或者報表的測試版本可以針對生產數據庫運行。我傾向於嘗試將SQL保留在報告中,但我知道可以爲其中的任何一種情況。 – 2013-04-09 19:06:19

2

,只要您在SSRS添加一個select語句默認情況下將通常添加參數你,如果你在select語句如膏:

select thing 
from table 
where item = @Parm1 

那麼它應該顯示在「報表設計器屏幕上報告數據「文件夾'參數'。如果該參數的值不存在,則需要爲主體正常工作。參數在SSRS中選擇不同,然後在SQL中選擇。你可以在他們自己的章節中定義它們

如果你想讓它忽略兩個參數,爲什麼你必須包含它們?這似乎有點反直覺。您有兩種選擇:

  1. 其中聲明變量將參數的「默認值」設置爲靜態值。

  2. 將該變量設置爲'允許空值'並處理空引用。

EDIT(下面CTE):

在SSRS你不這樣做(一般來說,有時你可能需要一個表變量,那就是罰款或其他靜態):

Declare @Var int; 

select thing 
from table 
where item = @Var 

你只是這樣做:

select thing 
from table 
where item = @Var 

然後你處理「參數」,因爲它是自己的財產有型和determin istic結果。

我只想做在SSRS的數據集:

with dates as 
(
select 
case @Q 
    when 1 then '1/1/' + convert(varchar(10),@Year) 
    when 2 then '4/1/' + convert(varchar(10),@Year) 
    when 3 then '7/1/' + convert(varchar(10),@Year) 
    when 4 then '10/1/' + convert(varchar(10),@Year) 
end as StartDate 
, case @Q 
    when 1 then '3/31/' + convert(varchar(10),@Year) 
    when 2 then '6/30/' + convert(varchar(10),@Year) 
    when 3 then '9/30/' + convert(varchar(10),@Year) 
    when 4 then '12/31/' + convert(varchar(10),@Year) 
end as EndDate 
) 
select things 
from mainbodytable, dates -- CTE reference 
where date between StartDate and EndDate -- referenced from CTE above 

確保你看到下「參數」文件夾中,並將其設置爲整數的「Q」和「年份」列出的參數。當用戶運行報告時,它會詢問這些值,只要它們是範圍內的合法值,他們就會確定數據集。 EG:它們不是無效的值,它將返回空值。

+0

然後,您如何在以後的查詢中引用StartDate和EndDate? – ajspacemanspiff 2013-04-09 19:22:11

+0

你需要問自己兩件事:1.如果我能得到信息本身,我是否真的需要一個變量?2.是否需要查看變量或變量是否過多。請參閱使用CTE更新的示例.... – djangojazz 2013-04-09 19:24:42

+0

我還要補充一點,將SSRS視爲具有多個變量的複雜SQL Management Studio表達式比其值得的更麻煩。 RDL語言(SSRS的xml結構)本質上是將參數視爲輸入。您可以隱藏和確定性的人,但有很多,你可以不設置過多的完成或者創建一個完成所有COMLEX內部邏輯SQL Server上的一個程序,只需要傳遞給它需要一個參數或兩個。 – djangojazz 2013-04-09 19:32:18

2

將參數添加到SSRS數據集的查詢中,以查詢查詢中未聲明的任何變量。

但是,一旦添加它們,它們並不總是自動刪除,因此您可能需要手動將它們從數據集查詢中刪除。

例如,這個查詢將只@ParamOne創建參數:

DECLARE @StartDate, @EndDate DATETIME 

SET @StartDate = 'January 1, 2013' 
SET @EndDate = 'February 1, 2013' 

SELECT 
    UserName, 
    Action, 
    DateOccurred 
FROM 
    myTable 
WHERE 
    DateOccurred BETWEEN @StartDate AND @EndDate 
AND UserName = @ParamOne 

但SSRS可以挑剔的資本。確保它們符合你的聲明和變量的使用。

+0

只是好奇,想知道該變量的靜態值是否讓SSRS忽略它的參數? – praveen 2013-04-09 19:08:54

+0

不,聲明。所述映射可以是'SELECT @StartDate = periodStart,@EndDate = periodEnd FROM週期p WHERE p.ID = @ PeriodID'和@PeriodID可以是(但@StartDate和@EndDate必須在delcared遞給僅SSRS參數查詢。) – 2013-04-09 19:13:38

+0

我不得不同意praveen。我的查詢DECLARE的變量和SSRS仍然認爲它們是參數。 – ajspacemanspiff 2013-04-09 19:14:54

2

保留報告中的參數,但給它們一個默認值並將它們設置爲隱藏。

查詢運行時,代碼將覆蓋@STARTDATE@ENDDATE值,因此默認值無關緊要。

+0

確切地說,這是真的... – Cloud 2017-10-18 09:01:29

0

裹的過程變成nvarchar(max)變量,然後執行它:

declare @statement nvarchar(max) 
set @statement='.... 
' 

exec sys.execsql(@statement)