webForumDet fria alternativet

T-SQL

3 svar · 326 visningar · startad av clarkbones

clarkbonesMedlem sedan feb. 20013 023 inlägg
#1

Hej!

Har en sp som hämtar alla kursdeltagare. Typ

SELECT * FROM KURSDELTAGARE

Nu vill jag utnyttja samma procedur för att hämta en enskild kursdeltagare.

Den resulterande SQL:en ska alltså se ut så här:

SELECT * FROM KURSDELTAGARE WHERE DELTAGARID=@DELTAGARID

Jag har tänkt att skicka in 0 som deltagarid då jag vill ha alla kursdeltagare och ett relevant kursdeltagarid då jag vill ha en enskild deltagare.

Hur kan jag hänga på where-villkoret på enklaste sätt då deltagarid<>0? DVS hur ska t-sql:en se ut?

BrimbaMedlem sedan dec. 19995 875 inlägg
#2

Nu pratar jag sql-server (vilken databas använder du?)

Ett sätt är att bygga upp din fråga dynamiskt i spn och exekvera den med sp_executesql.

Ett annat sätt är att använda case, exempelvis

SELECT 
    * 
FROM 
    KURSDELTAGARE 
WHERE 
    DELTAGARID = CASE @DELTAGARID WHEN 0 THEN DELTAGARID ELSE @DELTAGARID END

ett annat sätt är att skapa två nya sp:s som du kör beroende på vad som skickas in, exempelvis

IF (@DELTAGARID > 0)
    EXEC deltagaremedid @DELTAGARID
ELSE
    EXEC deltaridutanid

ett tredje sätt är att ha två frågor direkt i spn, exempelvis

IF (@DELTAGARID > 0)
    SELECT * FROM KURSDELTAGARE WHERE DELTAGARID=@DELTAGARID
ELSE
    SELECT * FROM KURSDELTAGARE
clarkbonesMedlem sedan feb. 20013 023 inlägg
#3

Jag använder SQL Server.

Den första lösningen verkar passa mig bäst. Tack. Men om personid är null så fungerar inte jämförelsen och posten returneras inte.

LukaspojkenMedlem sedan maj 20011 312 inlägg
#4

Varför inte skapa en ny procedur som hanterar alla deltagare? I alla fall, jag tror jag såg denna struktur på where-sats ute här på forumet.

SELECT * FROM KURSDELTAGARE 
WHERE DELTAGARID = @DELTAGARID OR 0 = @DELTAGARID
123 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
119 ms — hämta tråd, inlägg och bilagor (db)