---
title: "sp Order By dynamiskt"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/59692-sp-order-by-dynamiskt"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "KalsongCesar"
published: "2002-11-19T16:44:09.000Z"
updated: "2002-11-21T13:17:53.000Z"
replies: 12
views: 224
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/59692-sp-order-by-dynamiskt"
---

# sp Order By dynamiskt

## #1 — KalsongCesar, 2002-11-19T16:44Z

har läst och hittat ngr svar här men de hjälpte inte mig.

Jag vill skicka med en variabel i min sp som styr vad som ska sorteras efter.
orginal

```
CREATE PROCEDURE spListUserPay2 
AS
SELECT   	DISTINCT Users.idxUser,
		Users.Title, 
		Users.Name, 
		Users.SurName, 	
		Users.BusinessName, 
		Users.Address1, 
                      	Users.Address2, 
		Users.Address3, 
		Users.City, 
		Users.PostCode, 
		Users.Email, 
		Users.expiryDate, 
		Users.betalatAbb, 
                      	Users.tempAccess, 
		Users.campaign, 
		Users.abonnemang,
		abonnemangstyper.beskrivning,
		Users.CreatedDate, 
		Campaigns.Name AS CampaignName, Campaigns.Months, 
                      Users.hantering, Invoice.Makulerad
FROM         Users INNER JOIN
                      abonnemangstyper ON abonnemangstyper.idxAbonnemang = Users.abonnemang INNER JOIN
                      Invoice ON Users.idxUser = Invoice.idxUser LEFT OUTER JOIN
                     Campaigns ON Users.idxCampaign = Campaigns.idxCampaign
WHERE     (Users.accepted = 1)  AND (Invoice.Makulerad = 0) AND Invoice.Paydate = NULL
ORDER BY Users.expiryDate DESC
GO
```

nu har jag provat med att lägga till min variabel. men det går inte..

```
CREATE PROCEDURE spListUserPay2 
@sort as varchar(20)
AS
SELECT   	DISTINCT Users.idxUser,
		Users.Title, 
		Users.Name, 
		Users.SurName, 	
		Users.BusinessName, 
		Users.Address1, 
                      	Users.Address2, 
		Users.Address3, 
		Users.City, 
		Users.PostCode, 
		Users.Email, 
		Users.expiryDate, 
		Users.betalatAbb, 
                      	Users.tempAccess, 
		Users.campaign, 
		Users.abonnemang,
		abonnemangstyper.beskrivning,
		Users.CreatedDate, 
		Campaigns.Name AS CampaignName, Campaigns.Months, 
                      Users.hantering, Invoice.Makulerad
FROM         Users INNER JOIN
                      abonnemangstyper ON abonnemangstyper.idxAbonnemang = Users.abonnemang INNER JOIN
                      Invoice ON Users.idxUser = Invoice.idxUser LEFT OUTER JOIN
                     Campaigns ON Users.idxCampaign = Campaigns.idxCampaign
WHERE     (Users.accepted = 1)  AND (Invoice.Makulerad = 0) AND Invoice.Paydate = NULL
ORDER BY @sort
GO
```

Kollade lite på en annan fråga som körde en select och vid vissa case casta om men det fick jag inte heller till..

Ngn som har lite tid över?

Permalänk: https://www.webforum.nu/p/59692

## #2 — LarsG, 2002-11-19T17:11Z

Eftersom du har distinct så kan du bara sortera på sådant som finns med i select-listan.

Om @sort innehåller kolumnnamn så:

```
CREATE PROCEDURE spListUserPay2 
@sort as varchar(20)
AS
SELECT   	DISTINCT Users.idxUser,
		Users.Title, 
		Users.Name, 
		Users.SurName, 	
		Users.BusinessName, 
		Users.Address1, 
                      	Users.Address2, 
		Users.Address3, 
		Users.City, 
		Users.PostCode, 
		Users.Email, 
		Users.expiryDate, 
		Users.betalatAbb, 
                      	Users.tempAccess, 
		Users.campaign, 
		Users.abonnemang,
		abonnemangstyper.beskrivning,
		Users.CreatedDate, 
		Campaigns.Name AS CampaignName, Campaigns.Months, 
                      Users.hantering, Invoice.Makulerad,
               case @sort when 'Title' then title
                                  when 'Name' then name end
                        as sort
FROM         Users INNER JOIN
                      abonnemangstyper ON abonnemangstyper.idxAbonnemang = Users.abonnemang INNER JOIN
                      Invoice ON Users.idxUser = Invoice.idxUser LEFT OUTER JOIN
                     Campaigns ON Users.idxCampaign = Campaigns.idxCampaign
WHERE     (Users.accepted = 1)  AND (Invoice.Makulerad = 0) AND Invoice.Paydate = NULL
ORDER BY sort
GO
```

Det går så länge alla kolumner som du vill sortera på är av samma datatyp.

Permalänk: https://www.webforum.nu/p/860547

## #3 — KalsongCesar, 2002-11-19T17:15Z

oki.. det verkar ju logiskt, men jag får inte ens skapa min sp det blir error 1008

Permalänk: https://www.webforum.nu/p/860551

## #4 — LarsG, 2002-11-19T17:39Z

1008 just det ja, jag förstår ... inte.

Vad är feltexten och hur ser proceduren ut?

Permalänk: https://www.webforum.nu/p/860570

## #5 — KalsongCesar, 2002-11-20T07:58Z

Error 1008: The SELECT item identified by the ORDER BY number 1 contains a variable as part of the expression identifying a column position. Variables are only allowed when ordering by an expression referencing a column name 
 \=)

Permalänk: https://www.webforum.nu/p/860944

## #6 — LarsG, 2002-11-20T13:16Z

```
CREATE PROCEDURE spListUserPay2 
@sort as varchar(20)
AS
select * from (
SELECT   	DISTINCT Users.idxUser,
		Users.Title, 
		Users.Name, 
		Users.SurName, 	
		Users.BusinessName, 
		Users.Address1, 
                      	Users.Address2, 
		Users.Address3, 
		Users.City, 
		Users.PostCode, 
		Users.Email, 
		Users.expiryDate, 
		Users.betalatAbb, 
                      	Users.tempAccess, 
		Users.campaign, 
		Users.abonnemang,
		abonnemangstyper.beskrivning,
		Users.CreatedDate, 
		Campaigns.Name AS CampaignName, Campaigns.Months, 
                      Users.hantering, Invoice.Makulerad
FROM         Users INNER JOIN
                      abonnemangstyper ON abonnemangstyper.idxAbonnemang = Users.abonnemang INNER JOIN
                      Invoice ON Users.idxUser = Invoice.idxUser LEFT OUTER JOIN
                     Campaigns ON Users.idxCampaign = Campaigns.idxCampaign
WHERE     (Users.accepted = 1)  AND (Invoice.Makulerad = 0) AND Invoice.Paydate = NULL) s
ORDER BY case @sort when 'Title' then title
                                  when 'Name' then name end
```

Permalänk: https://www.webforum.nu/p/861111

## #7 — KalsongCesar, 2002-11-20T14:31Z

tack, jag provade din lösning, som jag även sett på ett annat fall här, åxå testat med cast för att få den till varchar men ingen förbättring. Det som händer nu är att den säger att fältet måste finnas med om distinct används.

Permalänk: https://www.webforum.nu/p/861137

## #8 — LarsG, 2002-11-20T15:50Z

Måste du ha distinct då?

Permalänk: https://www.webforum.nu/p/861197

## #9 — KalsongCesar, 2002-11-20T15:52Z

ja, jag väljer ut en person och dennes fakturor.. har den fler så vill jag inte få upp honnom flera ggr på listan.

Permalänk: https://www.webforum.nu/p/861199

## #10 — LarsG, 2002-11-20T15:56Z

oki, nytt förslag

```
if @sort = 'Title' 

SELECT   	DISTINCT Users.idxUser,
		Users.Title, 
		Users.Name, 
		Users.SurName, 	
		Users.BusinessName, 
		Users.Address1, 
                      	Users.Address2, 
		Users.Address3, 
		Users.City, 
		Users.PostCode, 
		Users.Email, 
		Users.expiryDate, 
		Users.betalatAbb, 
                      	Users.tempAccess, 
		Users.campaign, 
		Users.abonnemang,
		abonnemangstyper.beskrivning,
		Users.CreatedDate, 
		Campaigns.Name AS CampaignName, Campaigns.Months, 
                      Users.hantering, Invoice.Makulerad
FROM         Users INNER JOIN
                      abonnemangstyper ON abonnemangstyper.idxAbonnemang = Users.abonnemang INNER JOIN
                      Invoice ON Users.idxUser = Invoice.idxUser LEFT OUTER JOIN
                     Campaigns ON Users.idxCampaign = Campaigns.idxCampaign
WHERE     (Users.accepted = 1)  AND (Invoice.Makulerad = 0) AND Invoice.Paydate is NULL
order by title
else if @sort = 'Name' 
SELECT   	DISTINCT Users.idxUser,
		Users.Title, 
		Users.Name, 
		Users.SurName, 	
		Users.BusinessName, 
		Users.Address1, 
                      	Users.Address2, 
		Users.Address3, 
		Users.City, 
		Users.PostCode, 
		Users.Email, 
		Users.expiryDate, 
		Users.betalatAbb, 
                      	Users.tempAccess, 
		Users.campaign, 
		Users.abonnemang,
		abonnemangstyper.beskrivning,
		Users.CreatedDate, 
		Campaigns.Name AS CampaignName, Campaigns.Months, 
                      Users.hantering, Invoice.Makulerad
FROM         Users INNER JOIN
                      abonnemangstyper ON abonnemangstyper.idxAbonnemang = Users.abonnemang INNER JOIN
                      Invoice ON Users.idxUser = Invoice.idxUser LEFT OUTER JOIN
                     Campaigns ON Users.idxCampaign = Campaigns.idxCampaign
WHERE     (Users.accepted = 1)  AND (Invoice.Makulerad = 0) AND Invoice.Paydate is NULL
order by name
```

Jag ändrade från = NULL till is NULL också.

Ett annat alternativ är att skapa en sträng som innehåller frågan 

```
@declare str varchar(2000)
set @str = 'SELECT   	DISTINCT Users.idxUser,
		Users.Title, 
		Users.Name, 
		Users.SurName, 	
		Users.BusinessName, 
		Users.Address1, 
                      	Users.Address2, 
		Users.Address3, 
		Users.City, 
		Users.PostCode, 
		Users.Email, 
		Users.expiryDate, 
		Users.betalatAbb, 
                      	Users.tempAccess, 
		Users.campaign, 
		Users.abonnemang,
		abonnemangstyper.beskrivning,
		Users.CreatedDate, 
		Campaigns.Name AS CampaignName, Campaigns.Months, 
                      Users.hantering, Invoice.Makulerad
FROM         Users INNER JOIN
                      abonnemangstyper ON abonnemangstyper.idxAbonnemang = Users.abonnemang INNER JOIN
                      Invoice ON Users.idxUser = Invoice.idxUser LEFT OUTER JOIN
                     Campaigns ON Users.idxCampaign = Campaigns.idxCampaign
WHERE     (Users.accepted = 1)  AND (Invoice.Makulerad = 0) AND Invoice.Paydate is NULL order by ' + @sort
exec (@str)
```

Permalänk: https://www.webforum.nu/p/861201

## #11 — KalsongCesar, 2002-11-20T15:57Z

Ska testa pronto imorgon bitti.. tack, dags att dra iväg..

Permalänk: https://www.webforum.nu/p/861202

## #12 — LarsG, 2002-11-21T12:35Z

För att slippa distinct så borde du kunna byta ut någon av dina joinar mot en korrelerad subquery (Eftersom jag inte orkar göra en begåvad gissning om din tabellstruktur så gör jag ett generellt exempel.)

```
select distint t1.c1,t1.c2 from t1 inner join t2 on t1.id  = t2.id
```

kan bytas mot

```
select c1,c2 from t1
where exists (select * from t2 where id = t1.id)
```

som förmodligen är effektivare också.

Permalänk: https://www.webforum.nu/p/861734

## #13 — KalsongCesar, 2002-11-21T13:17Z

funkade fint att ha if satsen som kollade strängen.... nöjer med det så länge.. men vem vet, kanske kommer tillbaka till tråden snabbare än jag trott ;)

Permalänk: https://www.webforum.nu/p/861755

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/59692-sp-order-by-dynamiskt
