ORDER Direction(ASC / DESC)不能用作SQL查询中的参数

时间:2016-08-03 07:43:34

标签: sql sql-server tsql

我正在编写一些参数化查询,我注意到使用" ASC / DESC"的参数。 SQL Server 2008中不允许部分ORDER。这会导致错误def f[U, T](l: List[U], v: T)

Incorrect syntax near '@p'.

但是,使用参数数量的参数可以正常工作,前提是您在其周围使用括号。

declare @p nvarchar
set @p = 'desc'

select * from Customer order by CustomerID @p

这有什么理由和任何解决方法吗?

这个问题提出了一个解决方法,但并没有说明为什么需要它: DESC and ASC as a parameter in stored procedure

4 个答案:

答案 0 :(得分:3)

尝试这样的事情

DECLARE @tbl TABLE(ID INT IDENTITY,SomeValue VARCHAR(100));

INSERT INTO @tbl(SomeValue) VALUES('a'),('b'),('c');

DECLARE @sortDirection VARCHAR(10)='ASC';

SELECT *
FROM @tbl
ORDER BY CASE WHEN @sortDirection='DESC' THEN ID END DESC
        ,CASE WHEN @sortDirection='ASC' THEN ID END ASC

修改

我带走了ELSE 0。如果排序列不是INT

,则不需要它会造成麻烦

答案 1 :(得分:0)

SELECT DQ.* FROM (
                 SELECT *,
                       (row_number() 
                           OVER (ORDER BY employeeID)) * 
                              CASE WHEN @sortDirection = 'ASC' THEN 
                                   1 
                              ELSE 
                                   -1 
                              END sort 
                                   from employeemaster) DQ
                   ORDER BY DQ.sort

然后你可以反转任何排序,包括在多个字段上排序和在nun-numeric上排序

答案 2 :(得分:0)

或者您可以使用存储过程:

    DECLARE @sqlQuery AS NVARCHAR(255)
    DECLARE @Order AS NVARCHAR(255) = 'DESC'

    SET @sqlQuery = '
        SELECT *
        FROM dbo.DimCustomer
        ORDER BY CustomerKey ' +  @Order


    EXEC sp_executesql @SQLQuery

答案 3 :(得分:0)

您可以使用动态SQL。您可以通过像tihs

这样的代码准备查询
declare @top int = 5;
declare @order varchar(4) = 'desc';

declare @sql nvarchar(max) = N'select top (' + cast(@top as varchar(max)) + ') * from Customer order by CustomerID ' + @order;

如果您尝试select @sql;,则会看到@sql

  

通过CustomerID desc

从客户订单中选择top(5)*

现在您可以通过sp_executesql函数执行查询,就像这样

execute sp_executesql @sql;