2013-04-09 10 views
6

Mam zapytanie, które działa bardzo dobrze w SQL. Kiedy próbuję wprowadzić to w SSRS, raport prosi o 4 parametry. Dwa z tych parametrów/zmiennych są w rzeczywistości opiera się na dwóch pozostałych parametrów jako takie:SSRS - Ignoruj ​​zmienne SQL w moim zapytaniu

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) ... 

Jak mogę uzyskać SSRS do tylko prosić o dwóch pierwszych parametrów (@Q, @Year) i zignorować @StartDate i @EndDate jak te są obliczane w zapytaniu?

Odpowiedz

-1

Nie sądzę, że jest to możliwe, ponieważ SSRS tworzy dynamic zapytanie i przetwarza wszystkie zmienne parametry .Tak AFAIK jedynym rozwiązaniem jest owinąć kwerendę w stored procedure

+0

downvoter opieka dodać komentarz? – praveen

+1

Przepraszam, ale jestem pewien, że się mylisz. Regularnie mam zmienne w moich zapytaniach SQL w SSRS, które nie są przechowywane Proc. –

+0

Nie sądzę, aby było to możliwe, gdy użyjesz symbolu @ w zapytaniu. Czy możesz mi pokazać jedno takie zapytanie? – praveen

0

Czy oddanie zapytanie do przechowywane proc? (powinieneś, jeśli nie jesteś, to tylko dobra praktyka). Jeśli używasz proca, możesz mieć tylko dwie zmienne wejściowe, a następnie zadeklarować tyle innych zmiennych wewnętrznych, ile potrzebujesz.

+0

Nie planowałem tworzenia przechowywanego procesu, ale jeśli będzie to konieczne. – ajspacemanspiff

+0

@ajspacemanspiff: jest to najlepsza praktyka. Zwłaszcza gdy chcesz zacząć przeszukiwanie bazy danych w poszukiwaniu rzeczy (takich jak cokolwiek używa pewnej tabeli?) Znacznie łatwiej jest polować na te rzeczy, jeśli jest po stronie DB. – Limey

+0

Często rezygnuje się z umieszczania zapytania w raporcie: raport może być niezależnie promowany od testu do produkcji lub wersja testowa raportu może być uruchomiona względem bazy produkcyjnej. Staram się trzymać kod SQL w raporcie, ale wiem, że dla każdego z nich można postawić przypadek. –

2

Ilekroć dodać select w SSRS będzie domyślnie generalnie dodać parametry dla Ciebie, jeśli wklej w instrukcji wyboru, takich jak:

select thing 
from table 
where item = @Parm1 

Następnie należy wyświetlić na ekranie raport projektanta pod ' Zgłoś dane "folder" Parametry ". Jeśli ten parametr z wartością nie istnieje, musi zostać dodany, aby twój główny korpus działał. Parametry są wybierane inaczej w SSRS niż w SQL. Definiujesz je we własnej sekcji.

Jeśli chcesz zignorować dwa parametry, dlaczego musisz je uwzględnić? To wydaje się trochę sprzeczne z intuicją. Masz dwie opcje:

  1. W przypadku deklaracji zmiennych ustaw "wartość domyślną" parametru na wartość statyczną.

  2. Ustaw zmienną na "Zezwalaj na wartości zerowe" i obsłuż referencję zerową.

EDIT (Z CTE poniżej):

W SSRS Nie rób tego (ogólnie mówiąc, czasami może chcesz zmiennej tabeli i to jest w porządku lub inne statyka):

Declare @Var int; 

select thing 
from table 
where item = @Var 

po prostu to zrobić:

select thing 
from table 
where item = @Var 

Następnie obsłużyć „parametru” jak to własność z rodzaju i determin Istotne wyniki.

Chciałbym po prostu zrobić to w zbiorze danych SSR za:

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 

Upewnij się, że można zobaczyć parametry wymienione na „Q” i „rok” istnieją w folderze 'parametrów i przedstawić je do liczb całkowitych. Gdy użytkownik uruchomi raport, poprosi o te wartości i określi zestaw danych, o ile są to prawidłowe wartości w zakresie. EG: nie są niepoprawnymi wartościami, które zwrócą wartości null.

+0

W jaki sposób odwołujesz się do StartDate i EndDate w późniejszych zapytaniach? – ajspacemanspiff

+0

Musisz zadać sobie dwie rzeczy: 1. Czy naprawdę potrzebuję zmiennej, jeśli mogę uzyskać samą informację 2. Czy zmienna musi być widoczna lub czy jest nadmierna? Zobacz zaktualizowany przykład przy użyciu CTE .... – djangojazz

+0

Dodałbym również, że traktowanie SSRS, jak złożone wyrażenie SQL Management Studio z wieloma zmiennymi, jest większym kłopotem, niż jest warte. RDL langauge (struktura xml SSRS) z natury jest uważany za parametry jako dane wejściowe.Możesz tworzyć ukryte i deterministyczne, ale wiele możesz osiągnąć bez ustawiania zbyt wielu lub stworzyć procedurę na serwerze SQL, która wykonuje całą złożoną wewnętrzną logikę i ma tylko parametr lub dwa potrzebne do przekazania. – djangojazz

2

Parametry są dodawane do zapytania zestawu danych SSRS dla dowolnych zmiennych w zapytaniu, które nie są również zadeklarowane w zapytaniu.

Jednak po ich dodaniu nie zawsze są automatycznie usuwane, więc może być konieczne ręczne usunięcie ich z kwerendy zestawu danych.

Na przykład, ta kwerenda będzie tworzyć tylko parametry @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 

Ale SSRS może być wybredny o kapitalizacji. Upewnij się, że pasują one do Twojej deklaracji i Twoich zastosowań zmiennej.

+0

Po prostu ciekawy, czy wartości statyczne do zmiennej sprawiają, że SSRS ignoruje go jako parametry? – praveen

+0

Nie, deklaracja. Mapowanie może wyglądać następująco: SELECT @StartDate = periodStart, @EndDate = periodEnd FROM p p WHERE p.ID = @ PeriodID' i @PeriodID może być jedynym przekazywanym parametrem SSRS. (Ale @StartDate i @EndDate muszą być rozrzucone w zapytanie.) –

+0

Muszę się zgodzić z praveen. W moim zapytaniu DECLARE zmienne i SSRS wciąż uważa je za parametry. – ajspacemanspiff

2

Zachowaj parametry w raporcie, ale podaj im wartość domyślną i ustaw jako ukryte.

Po uruchomieniu zapytania kod zastąpi wartości @STARTDATE i @ENDDATE, więc wartości domyślne nie będą miały znaczenia.

+0

dokładnie, to prawda ... – Cloud

0

Wrap procedura do zmiennej nvarchar(max) a następnie wykonać go:

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

exec sys.execsql(@statement) 
Powiązane problemy