webForumDet fria alternativet

T-SQL

Databaser & SQL

3 svar · 328 visningar · startad av clarkbones

Medlem sedan feb. 20013 023 inlägg
Frågan#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?

Medlem sedan dec. 19995 874 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
Medlem 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.

Medlem 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
251 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)