DESCENDING / ASCENDING存储过程的参数

时间:2009-05-11 14:20:18

标签: tsql stored-procedures

我有以下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 Casements,IF语句等等但是由于我想要插入一个关键字。

帮助将非常受欢迎,我已经尝试了必须记住的事情,但却未能做到正确。

3 个答案:

答案 0 :(得分:9)

您可以使用两个按字段排序:

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

如果没有WHEN子句匹配,CASE将评估为NULL,因此导致两个字段中的一个为每行评估为NULL(不影响排序顺序),另一个具有适当的方向。

但是,一个缺点是您需要复制@sortBy CASE语句。您可以使用带有sp_executesql的动态SQL并根据参数编写“ASC”或“DESC”文字来实现相同的功能。

答案 1 :(得分:1)

这段代码很快就会变得非常难以管理,因为你需要对你的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)

答案 2 :(得分:0)

您可以使用一些动态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