Hej, jag försöker att göra en order by - med en casesats som inte vill sig men sett flera exempel på nätet där det förekommer. Jag har en tabell innehållande två fält, ett numeriskt (int) och ett textfält (varchar). När jag vill sortera på varchar-fältet får jag följande fel: Den kan bara returnera en datatyp från case-satsen. Vet inte varför den väljer int i detta fall, men den gör lika för mig. Det verkar ju inneffektivt att ha en Case sats i SQL-satsen. Det behövs väl egentligen inte? Det har ingen större betydelse vad jag kan se. Varianten med if-satsen får en lite tyngre queryplan, men i praktiken är båda varianterna ungefär lika snabba. Det är nog mest en smaksak :) Varför är det lika snabba? Hur Jämför det sig med två separata? Ehh? Jag har testat några testfall med SET STATISTICS TIME ON, och ser att de verkar överensstämma väldigt bra i tid. Har du gjort tester mot en indexerad kolumn och en oindexerad? Vet du hur vad som gäller för cachning av resultatet? osv... Lite överdrivet... Gör det du om du vill. Vi har ju ändå inte alla uppgifter om hans struktur m.mProblem med Order By och case/when
<code>
sp_Annons_newtipsSorted 180,1
Server: Msg 245, Level 16, State 1, Procedure sp_Annons_newtipsSorted, Line 7
Syntax error converting the varchar value 'En bok om Macromedia Flash 4' to a column of data type int.
</code>
Exempel:
<code>
CREATE PROCEDURE sp_Annons_newtipsSorted
@kommunid int = null
,@sortfield int = 0
AS
set nocount on
select lngID, strDescShort, lngVisitors, dteCreated,
substring(strDescLong,1,350) as info, strLink,
strGroup +' - '+ subText as header, strFile,
strName, strEmail, annonstypid, kommunid, price
from
tblAnnons t,
tblAnnonsSubject ts,
tblAnnonsGroups tg
where
ts.lngSubjectID = t.lngSubjectID
and tg.lngGroupId = t.lngGroupID
and kommunid = @kommunid
and dateadd(m, 2, dteCreated) > dteCreated
order by
case @sortfield when 1 then strdescshort
when 2 then price
end
</code>
Någon som kan hjälpa mig förstå varför den försöker översätta varchar till integer?Sv: Problem med Order By och case/when
Workaround kommer här =)
order by
case @sortfield when 1 then strdescshort
when 2 then ''
end,
case @sortfield when 2 then price
when 1 then 0
endSv: Problem med Order By och case/when
Kan du inte skriva?
<code>
CREATE PROCEDURE sp_Annons_newtipsSorted
@kommunid int = null,
@sortfield int = 0
AS
SET NOCOUNT ON
IF @sortfield = 1
SELECT lngID, strDescShort, lngVisitors, dteCreated,
substring(strDescLong,1,350) as info, strLink,
strGroup +' - '+ subText as header, strFile,
strName, strEmail, annonstypid, kommunid, price
FROM
tblAnnons t LEFT JOIN
tblAnnonsSubject ts ON t.lngSubjectID = ts.lngSubjectID LEFT JOIN
tblAnnonsGroups tg ON t.lngGroupID = tg.lngGroupId
WHERE
kommunid = @kommunid
ORDER BY
strdescshort
ELSE IF @sortfield = 2
SELECT lngID, strDescShort, lngVisitors, dteCreated,
substring(strDescLong,1,350) as info, strLink,
strGroup +' - '+ subText as header, strFile,
strName, strEmail, annonstypid, kommunid, price
FROM
tblAnnons t LEFT JOIN
tblAnnonsSubject ts ON t.lngSubjectID = ts.lngSubjectID LEFT JOIN
tblAnnonsGroups tg ON t.lngGroupID = tg.lngGroupId
WHERE
kommunid = @kommunid
ORDER BY
price
</code>
Annars är det väl bättre att istället skapa två stored procedures. En som sorterar på beskrivning och en som sorterar på pris. Ger väl SQL servern bättre förutsättningar för att optimer och cacha resultat.
Vet inte om SQL experterna håller med mig? KAnske inte är så stor skilland?Sv: Problem med Order By och case/when
Sv: Problem med Order By och case/when
Sv: Problem med Order By och case/when
Sv: Problem med Order By och case/when
Sv: Problem med Order By och case/when