DESCENDING / ASCENDING Параметр для хранимой процедуры - PullRequest
4 голосов
/ 11 мая 2009

У меня есть следующий SP

CREATE PROCEDURE GetAllHouses
    set @webRegionID = 2
    set @sortBy = 'case_no'
    set @sortDirection = 'ASC'

    AS
    BEGIN

        Select 
            tbl_houses.*
        from tbl_houses 
        where 
            postal in (select zipcode from crm_zipcodes where web_region_id = @webRegionID)
        ORDER BY 
            CASE UPPER(@sortBy) 
                    when 'CASE_NO' then case_no 
                    when 'AREA' then area 
                    when 'FURNISHED' then furnished 
                    when 'TYPE' then [type] 
                    when 'SQUAREFEETS' then squarefeets 
                    when 'BEDROOMS' then bedrooms 
                    when 'LIVINGROOMS' then livingrooms 
                    when 'BATHROOMS' then bathrooms 
                    when 'LEASE_FROM' then lease_from 
                    when 'RENT' then rent 
                    else case_no 
            END 
    END
    GO

Теперь все в этом SP работает, но я хочу иметь возможность выбирать, хочу ли я сортировать ASCENDING или DESCENDING. Я действительно не могу найти никакого решения для этого с помощью SQL и не могу найти ничего в Google.

Как вы можете видеть, у меня есть параметр sortDirection, и я пытался использовать его несколькими способами, но всегда с ошибками ... Испытательные выражения Case, операторы IF и так далее, но это усложняется тем фактом, что я хочу вставить ключевое слово.

Помощь будет очень цениться, я попробовал все то, что приходит в голову, но не смог понять ее правильно.

Ответы [ 3 ]

9 голосов
/ 11 мая 2009

Вы можете использовать два порядка по полям:

CASE @sortDir WHEN 'ASC' THEN
    CASE UPPER(@sortBy)
        ...
    END
END ASC,
CASE @sortDir WHEN 'DESC' THEN
    CASE UPPER(@sortBy)
        ...
    END
END DESC

CASE будет оцениваться как NULL, если ни одно из предложений WHEN не соответствует, так что одно из двух полей будет оцениваться как NULL для каждой строки (не влияет на порядок сортировки), а другое имеет соответствующее направление.

Однако один недостаток заключается в том, что вам нужно будет дублировать оператор @sortBy CASE. Вы можете добиться того же, используя динамический SQL с sp_executesql и записав литерал 'ASC' или 'DESC' в зависимости от параметра.

1 голос
/ 11 мая 2009

Этот код станет очень неуправляемым очень быстро, так как вам нужно будет дважды вложить ваш CASE WHEN ... один набор для столбца для упорядочения и вложенный набор для того, является ли он ASC или DESC

Может быть, лучше рассмотреть возможность использования динамического SQL здесь ...

DECLARE @sql nvarchar(max)
SET @sql = '
        Select 
                tbl_houses.*
        from tbl_houses 
        where 
                postal in (select zipcode from crm_zipcodes where web_region_id = ' + @webRegionID + ') ORDER BY '

SET @sql = @sql + ' ' + @sortBy + ' ' + @sortDirection

EXEC (@sql)
0 голосов
/ 11 мая 2009

Вы можете сделать это с помощью некоторого динамического SQL и вызвать его с помощью EXEC. Остерегайтесь внедрения SQL, хотя, если пользователь имеет какой-либо контроль над параметрами.

CREATE PROCEDURE GetAllHouses
    set @webRegionID = 2 
    set @sortBy = 'case_no'
    set @sortDirection = 'ASC'
    AS
    BEGIN
    DECLARE @dynamicSQL NVARCHAR(MAX)

    SET @dynamicSQL =
    '
    SELECT
        tbl_houses.*
    FROM
        tbl_houses
    WHERE
        postal
    IN
    (
        SELECT
            zipcode
        FROM
            crm_zipcodes
        WHERE
            web_region_id = ' + CONVERT(nvarchar(10), @webRegionID) + '
    )
    ORDER BY
        ' + @sortBy + ' ' + @sortDirection

    EXEC(@dynamicSQL)

    END
    GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...