18. marts 2004 - 13:14Der er
47 kommentarer og 1 løsning
sql syntax order by
jeg har en procedure der selecter en masse rækker. Jeg vil vælge hvad den skal 'orders by' ved hjælp af et inputparameter og noget IF sætning, men hvordan er syntaksen?
CREATE PROCEDURE getBugs2 @ProjectID integer, @sort_item varchar(10) AS SELECT (en hel masse rækker...) FROM (en hel masse tabeller) WHERE (en hel masse betingelser)
og så hvad??? måske sådan noget?:
IF @sort_item = 'dateSort' ORDER BY BugReportDate DESC IF @sort_item = 'customerSort' ORDER BY CustomerFirstName IF @sort_item = 'bugtypeSort' ORDER BY BugTypeDescription IF @sort_item = 'bugstatusSort' ORDER BY BugReportDate DESC
CREATE PROCEDURE getBugs2 @ProjectID integer, @sort_item varchar(10) AS SELECT (en hel masse rækker...) FROM (en hel masse tabeller) WHERE (en hel masse betingelser) order by case when @sort_item = 'dateSort' then <date-feltets nummer i select> when @sort_item = 'customerSort' then <customer-feltets nummer i select> else <default-sorteringsfeltets nummer i select> end
Du kan ikke bare bruge feltnavnet, da du har forskellige felttyper, og der forsøges konvertering til fælles datatype, hvilket ofte vil blive int.
Jeg selecter dette her, er <date-feltets nummer i select> så 1 eller 2 eller hvad er det for noget?
SELECT tblBugs.BugID, tblBugs.BugReportDate, tblBugTypes.BugTypeDescription, tblBugs.BugDescription, BugDescReply = case when BugDescReply is Null Then '' Else BugDescReply End , tblCustomers.CustomerFirstName, tblCustomers.CustomerLastName, tblCustomers.CustomerEmail1, tblDepartments.DepartmentName, tblCompanies.CompanyName, CompanyWWW= case when CompanyWWW is Null Then '' Else CompanyWWW End ,--isnull(companywww,'') as companywwww tblBugStatus.BugStatusDescription, tblBugHandlers.BugHandlerFirstName, tblBugHandlers.BugHandlerLastName, tblBugHandlers.BugHandlerEmail
ORDER BY CASE when @sort_item = 'dateSort' then 2 when @sort_item = 'customerSort' then 6 else 2 end
Server: Msg 1008, Level 15, State 1, Procedure getBugs2, Line 38 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.
samme fejl: Server: Msg 1008, Level 15, State 1, Procedure getBugs2, Line 38 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.
på datoen fungerer det fint, tilsyneladende også på den ene varchar (CustomerFirstName) men ikke når jeg sorterer på BugTypeDescription eller BugStatusDescription
jeg ved det ikke jeg smider lige hele proceduren som den ser ud nu:
if exists (select * from dbo.sysobjects where id = object_id(N'[azomian].[getBugs2]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) DROP PROCEDURE getBugs2 GO CREATE PROCEDURE getBugs2 @ProjectID integer, @sort_item varchar(10)
AS
SELECT tblBugs.BugID, tblBugs.BugReportDate, tblBugTypes.BugTypeDescription, tblBugs.BugDescription, BugDescReply = case when BugDescReply is Null Then '' Else BugDescReply End , tblCustomers.CustomerFirstName, tblCustomers.CustomerLastName, tblCustomers.CustomerEmail1, tblDepartments.DepartmentName, tblCompanies.CompanyName, CompanyWWW= case when CompanyWWW is Null Then '' Else CompanyWWW End ,--isnull(companywww,'') as companywwww tblBugStatus.BugStatusDescription, tblBugHandlers.BugHandlerFirstName, tblBugHandlers.BugHandlerLastName, tblBugHandlers.BugHandlerEmail FROM tblBugs, tblBugTypes, tblCustomers, tblDepartments, tblCompanies, tblBugStatus, tblBugHandlers WHERE tblBugs.ProjectID=@ProjectID AND tblBugs.BugTypeID=tblBugTypes.BugTypeID AND tblBugs.CustomerID=tblCustomers.CustomerID AND tblCustomers.DepartmentID=tblDepartments.DepartmentID AND tblDepartments.CompanyID=tblCompanies.CompanyID AND tblBugs.BugStatusID=tblBugStatus.BugStatusID AND tblBugs.BugHandlerID=tblBugHandlers.BugHandlerID
ORDER BY CASE when @sort_item = 'dateSort' then BugReportDate --smalldate when @sort_item = 'customerSort' then tblCustomers.CustomerLastName --varchar when @sort_item = 'bugTypeSort' then BugTypeDescription --varchar when @sort_item = 'bugStatusSort' then BugStatusDescription --varchar else BugReportDate end
ORDER BY CASE when @sort_item = 'dateSort' then convert(varchar(8), BugReportDate, 112) --smalldate when @sort_item = 'customerSort' then tblCustomers.CustomerLastName --varchar when @sort_item = 'bugTypeSort' then BugTypeDescription --varchar when @sort_item = 'bugStatusSort' then BugStatusDescription --varchar else BugReportDate end
Det, jeg gør her, er at caste datoen til en varchar med formatet yyyymmdd. Derved kan den datosortere som en streng (og dermed samme felttype som de øvrige).
SELECT tblBugs.BugID, tblBugs.BugReportDate, tblBugTypes.BugTypeDescription, tblBugs.BugDescription, BugDescReply = case when BugDescReply is Null Then '' Else BugDescReply End , tblCustomers.CustomerFirstName, tblCustomers.CustomerLastName, tblCustomers.CustomerEmail1, tblDepartments.DepartmentName, tblCompanies.CompanyName, CompanyWWW= case when CompanyWWW is Null Then '' Else CompanyWWW End ,--isnull(companywww,'') as companywwww tblBugStatus.BugStatusDescription, tblBugHandlers.BugHandlerFirstName, tblBugHandlers.BugHandlerLastName, tblBugHandlers.BugHandlerEmail FROM tblBugs, tblBugTypes, tblCustomers, tblDepartments, tblCompanies, tblBugStatus, tblBugHandlers WHERE tblBugs.ProjectID=1 AND tblBugs.BugTypeID=tblBugTypes.BugTypeID AND tblBugs.CustomerID=tblCustomers.CustomerID AND tblCustomers.DepartmentID=tblDepartments.DepartmentID AND tblDepartments.CompanyID=tblCompanies.CompanyID AND tblBugs.BugStatusID=tblBugStatus.BugStatusID AND tblBugs.BugHandlerID=tblBugHandlers.BugHandlerID
ORDER BY BugTypeDescription
-fungerer det fint, men altså ikke via proceduren...
så prøvede jeg at fjerne convert fra casen og gå til bage til
ORDER BY CASE when @sort_item = 'dateSort' then BugReportDate when @sort_item = 'customerSort' then tblCustomers.CustomerLastName when @sort_item = 'bugTypeSort' then BugTypeDescription when @sort_item = 'bugStatusSort' then BugStatusDescription else BugReportDate end
så bliver det omvendt, så fungerer
'customerSort', 'bugTypeSort' og 'bugStatusSort'
men ved exec getBugs2 2,customerSort fås:
Server: Msg 295, Level 16, State 3, Procedure getBugs2, Line 5 Syntax error converting character string to smalldatetime data type.
SE BORT FRA FORRIGE KOMMENTAR, DET SKULLE HAVE VÆRET:
det gik lidt hurtigt
så prøvede jeg at fjerne convert fra casen og gå til bage til
ORDER BY CASE when @sort_item = 'dateSort' then BugReportDate when @sort_item = 'customerSort' then tblCustomers.CustomerLastName when @sort_item = 'bugTypeSort' then BugTypeDescription when @sort_item = 'bugStatusSort' then BugStatusDescription else BugReportDate end
så bliver det omvendt, så fungerer
dateSort
men ved exec getBugs2 2,customerSort fås:
Server: Msg 295, Level 16, State 3, Procedure getBugs2, Line 5 Syntax error converting character string to smalldatetime data type.
ORDER BY CASE when @sort_item = 'dateSort' then convert(varchar(8), BugReportDate, 112) when @sort_item = 'customerSort' then tblCustomers.CustomerLastName when @sort_item = 'bugTypeSort' then BugTypeDescription when @sort_item = 'bugStatusSort' then BugStatusDescription else convert(varchar(8), BugReportDate, 112) end
min testdata er rækker, hvor BugReportDate giver current_timestamp, dvs. datoen vil "ligge i samme kronologiske rækkefølge" som det ID rækken bliver givet. Derfor ville jeg ikke kunne se om dateSort egentlig fungerer. Derfor tester jeg det ved at sætte DESC og ASC efter ORDER BY delen, og med begge dele står datoen i samme rækkefølge, men så tænker jeg: måske virker den sådan set, men ASC og DESC kan ikke benyttes på tal? jeg ved godt datoen er konverteret til en varchar, men den indeholder jo stadig tal..? er det et vildskud?
ORDER BY CASE when @sort_item = 'dateSort' then convert(varchar(25), BugReportDate, 121) when @sort_item = 'customerSort' then tblCustomers.CustomerLastName when @sort_item = 'bugTypeSort' then BugTypeDescription when @sort_item = 'bugStatusSort' then BugStatusDescription else convert(varchar(25), BugReportDate, 121) end
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.