webForumDet fria alternativet

Att bygga en flexibel SQL-fråga i en SP

1 svar · 189 visningar · startad av ElMaco

ElMacoMedlem sedan juni 2000161 inlägg
#1

Det började med att jag skulle skapa mig en lagrad procedur som kunde ta ett eller flera argument, beroende på hur tydlig användaren var i sin sökning.

create proc getFile @fileName varchar(50) = '%',
@fileExtension varchar(5) = '%',
@categoryID int = 0,
@sort varchar(25) = 'fileName',
@order varchar(25) = 'ASC'
as
If @categoryID <> 0
	Begin
		SELECT * FROM tblFile
		WHERE
		[fileName] LIKE '%' + @fileName + '%'
		AND
		fileExtension LIKE @fileExtension
		AND
		categoryID = @categoryID
		ORDER BY @sort + ' ' + @order
	End
Else If @categoryID = 0
	Begin
		SELECT * FROM tblFile
		WHERE
		[fileName] LIKE '%' + @fileName + '%'
		AND
		fileExtension LIKE @fileExtension
		ORDER BY @sort + ' ' + @order
	End

Sen kom jag på att jag ibland gör en referential join med categoryID - men inte alltid - beroende på om användaren anger ett kategori-ID. Om jag låter default vara 0 så kommer inte några poster att returneras.

If-satsen är en klumpig och inte särskilt skalbar lösning. Hur skulle man kunna lösa detta bättre?

Idealt hade jag velat konkatinera SQL-frågan med fler AND-satser beroende på hur många parametrar som jag får in (och som inte förses med defaultvärden).

Idéer? Någon?

/M.

BrimbaMedlem sedan dec. 19995 875 inlägg
#2
create proc getFile @fileName varchar(50) = '%',
@fileExtension varchar(5) = '%',
@categoryID int = 0,
@sort varchar(25) = 'fileName',
@order varchar(25) = 'ASC'
as

SELECT * FROM tblFile
WHERE
[fileName] LIKE '%' + @fileName + '%'
AND
fileExtension LIKE @fileExtension
AND
categoryID = CASE @categoryID WHEN 0 THEN categoryID ELSE @categoryID END 
ORDER BY @sort + ' ' + @order
130 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)