Tänkte bara dubbelkolla, misstänker att det inte går :-( Det går alldeles utmärkt att göra det. Man får dock trixa lite. Det här exemplet borde förklara: Tackar så mycket... Är det inte bättre att skriva: Det tycker jag inte. Det är egentligen ingenting att optimera, eftersom det är ändå själva sorteringen som tar tid och resurser att utföra, den blir ju exakt densamma i vilket fall som helst. Den enda skillnaden i exekveringsplanen är istället en liten Compute Scalar operation för mitt förslag där den gör om CASE-satsen till ett IF-uttryck internt, men det kommer aldrig att påverka prestandan överhuvudtaget. Tvärtom så kan en procedur som utför olika frågor beroende på någon variabel (med IF-satser som i ditt exempel, dock finns ej ELSEIF utan man får nästla dem) få svårigheter att återanvända exekveringsplaner. Måste dessa kompileras om ofta blir prestandan definitivt lidande i ditt exempel.T-sql variabler för exempelvis sortering
Om man har en enkel query som denna i en stored procedure:
<code>
SELECT fält1, fält2 FROM Tabell ORDER BY fält1 DESC
</code>
Finns det någon möjlighet att skicka in en variabel som säger vilken sorteringsordning man vill ha?
Jag vill mao byta ut DESC mot en variabel så det blir så här:
<code>
SELECT fält1, fält2 FROM Tabell ORDER BY fält1 @stororder
</code>
Just detta funkar ju inget vidare, funkar ju inte alls faktiskt. ;-)
Det är förvisso inget större problem om det bara är sorteringen man vill åt men man kanske vill välja vilket fält det ska sorteras med dessutom och man har ett gäng fält då blir det mycket...
ex
fält1 asc
fält1 desc
fält2 asc
fält2 desc
fält3 asc
fält3 desc
osv osv...
Finns det något sätt att lösa det på förutom en väldans massa vilkorssatser i proceduren?Sv: T-sql variabler för exempelvis sortering
<code>
use northwind
declare @sort int
set @sort = 1
select * from orders
order by
case when @sort = 1 then customerid else null end asc
, case when @sort = 2 then customerid else null end desc
, case when @sort = 3 then orderdate else null end asc
, case when @sort = 4 then orderdate else null end desc
</code>Sv: T-sql variabler för exempelvis sortering
Var det så enkelt, ska genast sätta igång och trixa :)Sv: T-sql variabler för exempelvis sortering
<code>
declare @sort int
set @sort = 1
IF @sort = 1
SELECT * FROM orders ORDER BY customerid ASC
ELSEIF @sort = 2
SELECT * FROM orders ORDER BY customerid DESC
ELSEIF @sort = 3
SELECT * FROM orders ORDER BY orderdate ASC
ELSEIF @sort = 4
SELECT * FROM orders ORDER BY orderdate DESC
Eller optimerar SQL motorn frågan?Sv: T-sql variabler för exempelvis sortering
Men huvudanledningen till att jag inte tycker man ska göra så är att det är otympligt. Nu var ju detta en väldigt enkel liten SQL-sats, men om det är en riktigt stor och komplicerad fråga blir det mycket oöverskådlig kod om samma fråga (förutom sorteringen då) upprepas flera gånger i en procedur. För att inte tala om att det är jobbigt att hålla på och duplicera kod sådär och man riskerar att göra en miss nånstans. Ska man ändå duplicera och göra en massa villkorstester kan man isf dessutom göra det i applikationen och bara skicka den fråga man är intresserad av.