webForumDet fria alternativet

Dynamisk SQL och CASE i WHERE-delen

Databaser & SQL

6 svar · 411 visningar · startad av Engine^

Medlem sedan dec. 20003 887 inlägg
Frågan#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?

Medlem sedan juni 200032 967 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

Medlem sedan dec. 20003 887 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.

Medlem sedan juni 200032 967 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

Medlem sedan dec. 20003 887 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

Medlem sedan dec. 200012 464 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.

Medlem sedan dec. 20003 887 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 ;)

258 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)