|
Posted by Pacific Fox on 04/14/07 06:33
Hi all,
I have a SQL statement that allows paging and dynamic sorting of the
columns, but what I can't figure out without making the SQL a dynamic
string and executing it, or duplicating the SQL statement between an
IF and ELSE statement.
Following is the SQL statement;
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[sp_search]
@search VARCHAR( 80 )
, @startRow INT = 1
, @endRow INT = NULL
, @postcode AS CHAR( 4 ) = NULL
, @suburb AS VARCHAR( 40 ) = NULL
, @stateIdentity AS TINYINT = NULL
, @fromLatitude AS REAL = NULL -- latitude the user is located in
, @fromLongitude AS REAL = NULL -- longitude the user is located in
, @sort TINYINT = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @calculateDistance BIT;
SET @calculateDistance = 0;
-- get the longitude and latitude if required
IF ( NOT @postcode IS NULL )
BEGIN
SELECT DISTINCT
@fromLatitude = latitude
, @fromLongitude = longitude
FROM tbl_postalcode
WHERE (postalcode = @postcode)
SET @calculateDistance = 1
END
ELSE IF ( NOT @suburb IS NULL AND NOT @stateIdentity IS NULL )
BEGIN
SELECT DISTINCT
@fromLatitude = latitude
, @fromLongitude = longitude
FROM tbl_locality
WHERE (locality = @suburb)
AND (stateIdentity = @stateIdentity)
SET @calculateDistance = 1
END
/*
ELSE IF ( @fromLatitude IS NULL AND @fromLongitude IS NULL )
BEGIN
RAISERROR( 'You need to pass a valid combination to this stored
procedure, example: postcode or suburb and state identity or longitude
and latitude', 18, 1 );
END*/
SELECT D1.[row]
, D1.[totalRecordCount]
, D1.[classifiedIdentity]
, D1.[title]
, D1.[summary]
, D1.[price]
, D1.[locality]
, D1.[state]
, D1.[postcode]
, D1.[addedLast24]
, D1.[dateStamp]
, D1.[t2Rank]
, D1.[t3Rank]
, D1.[tRank]
, D1.[distance]
, F.[originalName]
, F.[extension]
, F.[uniqueName]
FROM (
-- derived table
SELECT ROW_NUMBER() OVER ( ORDER BY CASE @sort WHEN 0 THEN
CAST( COALESCE( t2.RANK, 0 ) + COALESCE( t3.RANK, 0 ) AS CHAR( 5 ) )
WHEN 1 THEN C.title WHEN 2 THEN CAST( CEILING( [dbo].
[fn_calculateDistance] ( @fromLatitude, @fromLongitude, L.latitude,
L.longitude ) ) AS CHAR( 9 ) ) WHEN 3 THEN ( C.locality + ' ' +
C.state ) WHEN 4 THEN CAST( C.price AS CHAR( 10 ) ) END ASC ) AS row
, COUNT( * ) OVER() AS totalRecordCount
, C.[classifiedIdentity]
, C.[title]
, C.[summary]
, C.[price]
, C.[locality]
, C.[state]
, C.[postcode]
, CASE WHEN ( C.[dateStamp] >= DATEADD( day, -1, GETDATE() ) )
THEN 1 ELSE 0 END AS addedLast24
, C.[dateStamp]
/* , t1.RANK AS t1Rank */
, t2.RANK AS t2Rank
, t3.RANK AS t3Rank
, /* COALESCE( t1.RANK, 0 ) + */ COALESCE( t2.RANK, 0 ) +
COALESCE( t3.RANK, 0 ) AS tRank
, CASE @calculateDistance WHEN 1 THEN CEILING( [dbo].
[fn_calculateDistance] ( @fromLatitude, @fromLongitude, L.latitude,
L.longitude ) ) ELSE 0 END AS distance
FROM [tbl_classified] AS C
INNER JOIN tbl_locality L
ON C.localityIdentity = L.localityIdentity
/* LEFT OUTER JOIN CONTAINSTABLE( tbl_category, title, @keyword ) AS
t1
ON FT_TBL.categoryIdentity = t1.[KEY] */
LEFT OUTER JOIN CONTAINSTABLE( tbl_classified, title, @search ) AS
t2
ON C.classifiedIdentity = t2.[KEY]
LEFT OUTER JOIN CONTAINSTABLE( tbl_classified, description,
@search ) AS t3
ON C.classifiedIdentity = t3.[KEY]
WHERE ( /* COALESCE( t1.RANK, 0 ) + */COALESCE( t2.RANK, 0 ) +
COALESCE( t3.RANK, 0 ) ) != 0
) AS D1
LEFT OUTER JOIN tbl_classified_file CF
ON D1.classifiedIdentity = CF.classifiedIdentity
LEFT OUTER JOIN tbl_file F
ON F.fileIdentity = CF.fileIdentity
WHERE ( row >= @startRow )
AND ( @endRow IS NULL OR row <= @endRow )
END
The part I'm having trouble with is making the sort order in the
following line dynamic
ORDER BY CASE @sort WHEN 0 THEN CAST( COALESCE( t2.RANK, 0 ) +
COALESCE( t3.RANK, 0 ) AS CHAR( 5 ) ) WHEN 1 THEN C.title WHEN 2 THEN
CAST( CEILING( [dbo].[fn_calculateDistance] ( @fromLatitude,
@fromLongitude, L.latitude, L.longitude ) ) AS CHAR( 9 ) ) WHEN 3 THEN
( C.locality + ' ' + C.state ) WHEN 4 THEN CAST( C.price AS
CHAR( 10 ) ) END ASC
any help would be greatly apprecaited.
Thanks
[Back to original message]
|