03. januar 2005 - 11:58Der er
31 kommentarer og 2 løsninger
Variable Where-betingelser i en Select sætning i en Stored Pro.
Jeg sidder og skal lave en stored procedure med en Select-sætning, hvor jeg har 4 Where-sætninger;
Select * From Tabel Where Betingelse1 = @Betingelse1 And Betingelse2 = @Betingelse2 And Betingelse3 = @Betingelse3 And Betingelse4 = @Betingelse4
De 4 variabler bliver overført som input-variabler til min Stored Procedure. Mit problem er, at hvis en variabel er null, så skal den ikke medtages i min Select-sætning. Hvordan gør jeg dette?
lytter lige med hvis der kommer en med en bedre løsning.. :-) Men jeg ville teste med if @betingelse1 IS NULL osv.. Men det giver mange forskellige cases og er lidt svært at holde styr på måske - altså med at du får alle sammen med. Men umiddelbart er det min fremgangsmåde.
som jeg forstår det skal han slette ikke tjekke den variabel hvis den er null. Altså hvis @betingelse4 er null -> så må [betingelse4] godt være lig med f.eks 5 eller "jens" altså ikke nødvendigvis skal være null. Men måske jeg læste det forkert.. ;-)
ISNULL(@betingelse1, betingelse1) giver betingelse1 hvie @betingelse1 er null - og betingelse1 i den sætning vil altid være lig med betingelse1. Er det ikke korrekt?
Jeg ved ikke om jeg er blevet misforstået, men det jeg skal bruge er, at hvis en, eller flere, af de overførte variabler er null, så skal den ikke medtages som en Where-betingelse. Dvs. det er ligegyldigt hvad det felt indeholder i min tabel
Som jeg skrev i : 03/01-2005 12:50:12 og kan prøve at forklare igen. Det Arnes løsning gør er: Hvis @betingelse er null så skriver den SELECT ... WHERE betingelse1 = betingelse1 og dette vil altid være sandt - og derfor det samme som at det ikke er der stort set.
CREATE procedure sp_Turnering_Hent_Alle @Navn VarChar, @Antal_Hold Int, @Spil_Id Int, @Status Int as SELECT Turnerings_Id From Turneringer WHERE Navn = IsNull(@Navn, Navn) And Antal_Hold = IsNull(@Antal_Hold, Antal_Hold) And Spil_Id = IsNull(@Spil_Id, Spil_Id) And Status = IsNull(@Status, Status) Order By Navn
du mangler = NULL Så dine parametre MÅ være null som default. Altså: CREATE procedure sp_Turnering_Hent_Alle @Navn VarChar = null, @Antal_Hold Int= null, @Spil_Id Int= null, @Status Int= null as SELECT Turnerings_Id From Turneringer WHERE Navn = IsNull(@Navn, Navn) And Antal_Hold = IsNull(@Antal_Hold, Antal_Hold) And Spil_Id = IsNull(@Spil_Id, Spil_Id) And Status = IsNull(@Status, Status) Order By Navn
Nej, du sætter dem som default null - hvis der så ikke er nogen værdi med som input til sp'en er de null - ellers er de den værdi der er med som input.
Server: Msg 2724, Level 16, State 1, Procedure sp_Turnering_Hent_Alle, Line 0 Parameter '@Navn' has an invalid data type. Parameter '@Navn' has an invalid data type.
Jeg får den fejl når jeg prøver at sætte @Navn VarChar = null
hvis du skal have mange data i din tabel, skal du være opmærksom på at MS SQL Server ikke kan finde ud af anvende det rigtige index, hvis dine parametre skifter. Du kan skrive således: create procedure xx ... with recompile as så recompileres sql hver gang den udføres, og derved bliver det rigtige index anvendt. hvis du ikke kan tillade en recompilering, skal du have fat i et forslag fra Dag Sommarskog. Det har jeg tidligere skrevet om, ellers prøv Google.
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.