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.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.