我正在编写一些参数化查询,我注意到使用" 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
答案 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;