Avatar billede lrh Nybegynder
10. januar 2005 - 13:35 Der er 5 kommentarer

Parameter / Where problem i stored procedure

Er det muligt at lave en dynamisk Where på baggrund af en parameter?

Har en sp der som (en af mange) parametre tar' en startdato & slutdato, hvor sidste enten kan være udfyldt eller null.

I data kan slutdato enten være udfyldt eller null, og det jeg ønsker at få returneret er:

hvis @Slutdato != NULL :  WHERE YEAR(OrderEndDate) <= @slutdato
hvis @Slutdato = NULL : Alt - ligegyldigt om data er udfyldt eller ej.

Nogen der ved hvordan sådan en WHERE skal bygges op?? så vidt jeg ved kan man ikke bruge IF eller CASE i en WHERE til at vælge om et kriterie skal med.

Håber det er forståeligt ;)
Avatar billede lorentsnv Nybegynder
10. januar 2005 - 14:09 #1
Du kan eventuelt bygge op din SQL i en string, og derefter eksekvere denne med EXEC som her:

CREATE PROCEDURE spTest
    @StartDato datetime='',
    @SlutDato datetime=''
AS

Declare @SQL as varchar(4000)

Set @SQL = 'Select * from Tabel '
if @SlutDato <> ''
begin
    Set @SQL = @SQL + 'WHERE YEAR(OrderEndDate) <= ''' + cast(@SlutDato as varchar(20)) + ''''
END
--print @SQL
exec(@SQL)
GO
Avatar billede lrh Nybegynder
10. januar 2005 - 14:23 #2
Hmm ja den mulighed er jeg stødt på andre steder, men er det virkelig den eneste måde at gøre det på?? virker ikke særlig elegant - mister formatering osv + den må da være dræbende for performance ??
Avatar billede lorentsnv Nybegynder
10. januar 2005 - 14:40 #3
Du kan vel også bruge if/else til at vælge hvilken SQL du vil køre:

IF @SlutDato <> ''
BEGIN
    Select * from Table WHERE YEAR(OrderEndDate) <= @SlutDato as varchar(20))
END
ELSE
    Select * from Table WHERE YEAR(OrderEndDate)
END

En tredje måde at gøre det på er at sette @SlutDato til en meget høj værdi hvids den ikke udfyldes, således at du ved at WHERE YEAR(OrderEndDate) <= @slutdato altid vil give TRUE når @SlutDato ikke er angivet.
Set den til '9999-12-31' hvis @SlutDato er datetime og '2079-6-6' hvis den er smalldatetime.
Avatar billede lrh Nybegynder
10. januar 2005 - 15:09 #4
Ja 1) ville være en fordel hvis der kun var slutdato, men hele select'en med joins etc er noget længere + indeholder 2 andre parameter der har samme problematik.

2. har jeg overvejet, men hvordan får jeg så alle de records hvor OrderEndDate = NULL??

men takker i øvrigt for dine glimrende forslag!
Avatar billede zapzap Nybegynder
11. januar 2005 - 14:20 #5
Du kunne jo også lave en temporær tabel, som du så selecter fra hvis der er noget slutkrav.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester