/ Forside/ Teknologi / Udvikling / SQL / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Order by i en stored procedure.
Fra : sandy
Vist : 1198 gange
100 point
Dato : 12-02-01 14:55

Hej,

Kan jeg lave en "order by" via en stored procedure, hvor jeg fortæller med parametere til min stored procedure, hvad der skal sorteres efter? Hvis ja, Hvordan?

Jeg bruger MS SQL.

Sandy

 
 
Accepteret svar
Fra : niller

Modtaget 110 point
Dato : 12-02-01 15:00

Hej Sandy,

Det er altid et spørgsmål der går igen og igen, ja det kan du godt.

Du kan enten bruge exec 'select * from a order by '+etellerandet, men denne løsning er meget langsom, istedet skal du gøre således, hvor du fortæller hvad nummer kolonne der skal sorteres efter :

CREATE PROCEDURE OrderProc @ordercol int AS
select * from a
order by case
when @ordercol=1 then felt1
when @ordercol=2 then felt2
else felt3
end

Kaldes således :

OrderProc 1

Hvor 1 er den kolonne du vil sortere efter.

>>Niller

Kommentar
Fra : Nyhedsbruger


Dato : 12-02-01 15:35

sandy wrote:
>
> Hej,
>
> Kan jeg lave en "order by" via en stored procedure, hvor jeg fortæller med parametere til min stored procedure, hvad der skal sorteres efter? Hvis ja, Hvordan?
>
> Jeg bruger MS SQL.

create procedure test
@sort varchar(30)
as
exec ("select * from tabel " + @sort)

--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@capgemini.dk | http://www.thehungersite.com



Kommentar
Fra : Nyhedsbruger


Dato : 12-02-01 18:22


"Kristian Damm Jensen" <kristian-Damm.Jensen@REMOVEcapgemini.dk> wrote in
message news:3A87F23F.5AFBF923@REMOVEcapgemini.dk...
> sandy wrote:
> >
> > Hej,
> >
> > Kan jeg lave en "order by" via en stored procedure, hvor jeg fortæller
med parametere til min stored procedure, hvad der skal sorteres efter? Hvis
ja, Hvordan?
> >
> > Jeg bruger MS SQL.
>
> create procedure test
> @sort varchar(30)
> as
> exec ("select * from tabel " + @sort)

Så skylder du lige at fortælle at dette faktisk resultere i dårligere
performance end at sende en select direkte, hvis altså proceduren ikke gør
væsentligt andre ting.




>
> --
> Kristian Damm Jensen | Feed the hungry. Go to
> kristian-damm.jensen@capgemini.dk | http://www.thehungersite.com
>
>



Godkendelse af svar
Fra : sandy


Dato : 12-02-01 22:56

Tak for svaret niller.
                        

Kommentar
Fra : Nyhedsbruger


Dato : 13-02-01 10:10

James Olsen wrote:
>
> "Kristian Damm Jensen" <kristian-Damm.Jensen@REMOVEcapgemini.dk> wrote in
> message news:3A87F23F.5AFBF923@REMOVEcapgemini.dk...
> > sandy wrote:
> > >
> > > Hej,
> > >
> > > Kan jeg lave en "order by" via en stored procedure, hvor jeg fortæller
> med parametere til min stored procedure, hvad der skal sorteres efter? Hvis
> ja, Hvordan?
> > >
> > > Jeg bruger MS SQL.
> >
> > create procedure test
> > @sort varchar(30)
> > as
> > exec ("select * from tabel " + @sort)
>
> Så skylder du lige at fortælle at dette faktisk resultere i dårligere
> performance end at sende en select direkte, hvis altså proceduren ikke gør
> væsentligt andre ting.

Det kunne jeg selvfølgelig godt have skrevet, men da det er den eneste
løsning på det stillede problem, tænkte jeg ikke lige over også at
overveje performance.

Rent bortset fra at jeg ikke var opmærksom på det - jeg har aldrig brugt
denne konstruktion i praksis. Er der nogen der ved *hvorfor* det giver
*væsentlig* dårligere performance?

--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@capgemini.dk | http://www.thehungersite.com



Kommentar
Fra : gandalf


Dato : 13-02-01 12:15

Hej Kristian,

Grunden til det giver dårligere performance, er fordi normalt er en stored procedure precompileret, dvs. den skal ikke compiles hver gang den bliver kaldt.
Ved at køre en "exec" inde i en stored procedure sørger for at din stored procedure skal fortolkes hver gang.

Med hensyn til at en order by ikke kan laves på anden måde, er dette ikke helt korrekt, hvis du fortæller hvad feltnr du vil sortere efter istedet :

CREATE PROCEDURE OrderProc @ordercol int AS
select * from a
order by case
when @ordercol=1 then felt1
when @ordercol=2 then felt2
else felt3
end

>>Gandalf

Kommentar
Fra : Nyhedsbruger


Dato : 13-02-01 14:41

gandalf wrote:
>
> Hej Kristian,
>
> Grunden til det giver dårligere performance, er fordi normalt er en stored procedure precompileret, dvs. den skal ikke compiles hver gang den bliver kaldt.
> Ved at køre en "exec" inde i en stored procedure sørger for at din stored procedure skal fortolkes hver gang.

Dette er en sammenligning mellem "exec" og en direkte sql, begge dele i
en SP. Her er jeg udmærket klar over, at der er en performancefaktor.

Men som jeg opfattede svaret på mit indlæg, var det en påstand om, at en
sql-forespørgsel eksekveret gennem exec i en sp er væsentligt
langsommere end den samme sql udført direkte på basen (gennem en prompt
eller et passende interface fra fx VB). Er dette korrekt, og givet fald,
hvorfor?

> Med hensyn til at en order by ikke kan laves på anden måde, er dette ikke helt korrekt, hvis du fortæller hvad feltnr du vil sortere efter istedet :
>
> CREATE PROCEDURE OrderProc @ordercol int AS
> select * from a
> order by case
> when @ordercol=1 then felt1
> when @ordercol=2 then felt2
> else felt3
> end

Ah, jeg havde glemt fordelene ved "case".


--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@capgemini.dk | http://www.thehungersite.com



Kommentar
Fra : Nyhedsbruger


Dato : 12-03-01 13:24


"gandalf" <gandalf.news@kandu.dk> wrote in message
news:_G8i6.54571$zw.973205@twister.sunsite.dk...
....
> CREATE PROCEDURE OrderProc @ordercol int AS
> select * from a
> order by case
> when @ordercol=1 then felt1
> when @ordercol=2 then felt2
> else felt3
> end
....

Det løste jo også lige mit problem
Hvordan kan ovennævnte udvides med et valg af sorteringsrækkefølgen
(asc/desc)?

mvh
Stefan



Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177413
Tips : 31962
Nyheder : 719565
Indlæg : 6407802
Brugere : 218875

Månedens bedste
Årets bedste
Sidste års bedste