Avatar billede target Nybegynder
03. januar 2005 - 11:58 Der 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?
Avatar billede anhansen Nybegynder
03. januar 2005 - 12:03 #1
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.
Avatar billede arne_v Ekspert
03. januar 2005 - 12:10 #2
Hvad med

(Betingelse1 = @Betingelse1 OR @Betingelse1 IS NULL)
Avatar billede arne_v Ekspert
03. januar 2005 - 12:13 #3
eller

Betingelse1 = ISNULL(@Betingelse1, Betingelse1)
Avatar billede target Nybegynder
03. januar 2005 - 12:37 #4
Lyder som noget som måske kan bruges. Kan du ikke lige prøve at skrive en simpel stored procedure hvor det bliver brugt?
Avatar billede anhansen Nybegynder
03. januar 2005 - 12:45 #5
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.. ;-)
Avatar billede arne_v Ekspert
03. januar 2005 - 12:46 #6
Sådan har jeg også læst den.

Men det burde ovenståend emåder at sammenligne på også klare.
Avatar billede arne_v Ekspert
03. januar 2005 - 12:48 #7
Du laver en SP de 4 argumenter og en SELECT statement og erstatter dine test
med et af mine.

Lige ud af landevejen.

Jeg kan godt lave et komplet eksempel senere.
Avatar billede anhansen Nybegynder
03. januar 2005 - 12:49 #8
sorry... din første løsning virker rigtig nok...

Er ikke helt vågen i det nye år... :-)
Avatar billede anhansen Nybegynder
03. januar 2005 - 12:50 #9
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?
Avatar billede terry Ekspert
03. januar 2005 - 12:51 #10
CREATE PROCEDURE spTest  ( @Betingelse1 int=Null)
AS
SELECT    *
FROM        dbo.tblTest T
WHERE T.SomeField = IsNull(@Betingelse1, T.SomeField)


GO
Avatar billede arne_v Ekspert
03. januar 2005 - 12:52 #11
yes
Avatar billede target Nybegynder
03. januar 2005 - 13:01 #12
Prøver lige. :D
Avatar billede target Nybegynder
03. januar 2005 - 13:26 #13
Jeg har lige prøvet at lave en test af det, og jeg kan på ingen måde få min Stored Procedure til at returnere noget data...
Avatar billede target Nybegynder
03. januar 2005 - 13:29 #14
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
Avatar billede anhansen Nybegynder
03. januar 2005 - 13:29 #15
hvordan ser den ud nu?
Avatar billede anhansen Nybegynder
03. januar 2005 - 13:34 #16
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.

Men virkede dit træk før?
Avatar billede target Nybegynder
03. januar 2005 - 13:35 #17
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
Avatar billede arne_v Ekspert
03. januar 2005 - 13:35 #18
Vi har forstået det.

Som anhansen siger: må vi se den SP du teester med ?
Avatar billede target Nybegynder
03. januar 2005 - 13:37 #19
Det skulle meget gerne virke sådan, at hvis jeg laver en
Exec sp_Turnering_Hent_Alle null, null, null, null
Så kommer alle felter ud fra min tabel...
Avatar billede arne_v Ekspert
03. januar 2005 - 13:37 #20
Den ser meget rigtig ud.

Er du sikker på at du får kaldt med NULL og ikke tom streng ?
Avatar billede anhansen Nybegynder
03. januar 2005 - 13:37 #21
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
Avatar billede target Nybegynder
03. januar 2005 - 13:38 #22
Så sætter jeg alle mine Input-variabler til null?
Avatar billede anhansen Nybegynder
03. januar 2005 - 13:42 #23
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.
Avatar billede target Nybegynder
03. januar 2005 - 13:43 #24
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
Avatar billede anhansen Nybegynder
03. januar 2005 - 13:46 #25
skal du ikke angive en størrelse på varchar'en.
Altså
@navn AS varchar(50) = null
f.eks
Avatar billede target Nybegynder
03. januar 2005 - 13:47 #26
Min fejl. :)
Avatar billede target Nybegynder
03. januar 2005 - 13:48 #27
Så ser det ud til at virke. :)
Avatar billede anhansen Nybegynder
03. januar 2005 - 13:48 #28
det var godt. :-)
Avatar billede target Nybegynder
03. januar 2005 - 13:49 #29
Så hvis i begge lige kommer med at svar, så får i point
Avatar billede anhansen Nybegynder
03. januar 2005 - 13:54 #30
Arne skal vist have mest... Det var jo primært hans løsning der gjorde det.

Min var bare lidt end support.. :-)
Avatar billede arne_v Ekspert
03. januar 2005 - 13:59 #31
svar
Avatar billede anhansen Nybegynder
03. januar 2005 - 15:08 #32
takker...
07. januar 2005 - 14:30 #33
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.
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