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.
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
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 ??
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.
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??
Du kunne jo også lave en temporær tabel, som du så selecter fra hvis der er noget slutkrav.
Synes godt om
Ny brugerNybegynder
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.