Tsql 存储过程的降序/升序参数

Tsql 存储过程的降序/升序参数,tsql,stored-procedures,Tsql,Stored Procedures,我有以下几点 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

我有以下几点

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中的所有内容都正常工作,但我希望能够选择是升序排序还是降序排序。 我真的找不到用SQL解决这个问题的方法,在谷歌也找不到任何东西

正如你所看到的,我有参数sortDirection,我尝试了多种方式使用它,但总是有错误。。。尝试了Case语句、IF语句等等,但由于我想插入一个关键字,这就复杂了


我会非常感谢您的帮助,我已经尝试了脑海中出现的一些事情,但都没有成功。

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

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”文本,可以实现同样的效果。

该代码将很快变得非常不可管理,因为在。。。一个集合用于列的排序依据,嵌套集合用于它是ASC还是DESC

最好考虑使用动态SQL……/P>

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)

您可以使用一些动态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
谢谢男人:)它起作用了,我尝试了你建议的解决方案,但只有一个案例和两个小时没有起作用,我知道为什么,谢谢你的解释。我也考虑过执行sql,但我也可以直接在C#中构建。。不过,我仍然感到不安的是,这种选择必须出现两次