webForumDet fria alternativet

Dynamisk SQL och CASE i WHERE-delen

6 svar · 411 visningar · startad av Engine^

Engine^Medlem sedan dec. 20002 861 inlägg
#1

Jag håller på och laborerar med lite dynamisk sql och har givetvis kört fast :)

Jag vill göra följande

DECLARE @strSql nvarchar(1000)
DECLARE @paramlist nvarchar(1000)

SET @strSql = 
	N'SELECT stuff
	FROM table
	WHERE country = @country AND round = @round
		CASE LEN(@alternativeSql) > 0
		THEN '' AND @alternativeSql''
		END 
	GROUP BY title_id'

SET @paramlist = N'@country int, @round int, @alternativeSql varchar(50)'

EXEC sp_executesql @strSql, @paramlist, @round=2, @country=1, @alternativeSql=''

Kan man använda CASE i WHERE eller behöver jag någon yttre SQL för detta?

@ndersMedlem sedan juni 200026 914 inlägg
#2

Du kan använda CASE i WHERE.

ORDER BY
CASE [b]WHEN[/b] foo=bar THEN
...
ELSE
...
END

Jag förstår dock inte helt vad du försöker göra i WHERE-satsen i din dynamiska SQL-fråga. (Glöm inte heller att escapea apostrofer inne i @strSQL).

mvh

Engine^Medlem sedan dec. 20002 861 inlägg
#3

Hmm... varför har du då inlett med ORDER BY?

Jo, det är så att @alternativeSql kan innehålla en, två eller många ytterligare kriterier.

@ndersMedlem sedan juni 200026 914 inlägg
#4

Hmm...

Nu när jag tänker efter så tror jag att jag tänkt helt fel.

men du kan ju kanske göra något sånt härnt:

SET @strSql = 
	N'SELECT stuff
	FROM table
	WHERE country = @country AND round = @round'
	if @alternativeSql <> '' begin
		set @strSQL = @strSQL + @alternativeSQL
	end
	set @strSQL = @strSQL + ' GROUP BY title_id'

Mvh

Engine^Medlem sedan dec. 20002 861 inlägg
#5

Det fungerar ju till en viss gräns. Problemet är att då tappar jag, så att säga, bort @alternativeSql ur själva @strSql. Då kan jag inte längre använda mig utav

SET @paramlist = N'@country int, @round int, @alternativeSql varchar(50)'

EXEC sp_executesql @strSql, @paramlist, @round=2, @country=1, @alternativeSql=''

om jag förstått det hela rätt.

Möjligen går jag en omväg nu :OO

LarsGMedlem sedan dec. 200012 465 inlägg
#6

Möjligen går jag en omväg nu

Återvändsgränd skulle jag säga. En parameter kan bara innehålla ett värde, inte predikat och dylikt, när den används i sp_executesql. Skriv så som @nders skriver.

Engine^Medlem sedan dec. 20002 861 inlägg
#7

Cul-de-sac... suck.

Jag fortsatte på @nders föreslagna spår, men det han bli helg. Nu är det måndag igen, så dags för nya friska tag ;)

Genererad på 379 ms · cache AV · v20260730165559-full.f96bc7eb