sql-server – 如何在不使用动态SQL的情况下在存储过程中使用Order By

我有以下MS sql存储过程.我需要在不使用动态sql和sp_executesql方法的情况下对结果进行排序

@Order by可以具有可能的值ProductName ASC,ProductName DESC,ProductCode ASC,vendorName DESC,vendorCode或ClientName

我试图使用ORDER BY CASE,如果ProductName,ProductCode属于不同类型,是否有任何问题?

ALTER PROCEDURE [dbo].[SortedReport]
(
    @ClientID INT,@RecordLimit,@FromDate DATETIME,@ToDate DATETIME,@OrderBy NVARCHAR(MAX)
)

AS
BEGIN

IF (@OrderBy IS NULL) BEGIN
    SET @OrderBy = 'ProductName';
END    

SELECT TOP (@RecordLimit) 
        sv.ClientID,sv.vendorID,sv.ProductID,sv.TransactionTime,sv.ClientName,sv.vendorName,sv.ProductName,sv.ProductCode,sv.vendorCode,FROM SortedReportiew AS sv 
WHERE (sv.ClientID = @ClientID)
    AND (sv.TransactionTime >= @FromDate)
    AND (sv.TransactionTime < @Date)

更新:

以下部分是否正确?从here开始

ORDER BY 
    CASE @OrderBy WHEN 'ProductCode ASC' THEN ProductCode WHEN 'ProductCode DESC' THEN ProductCode END DESC,CASE @OrderBy WHEN 'ProductName ASC' THEN ProductName WHEN 'ProductName DESC' THEN ProductName END DESC,

解决方法

正如您所说:使用ORDER BY CASE,但多次使用以避免不同列类型的问题:
...
ORDER BY 
 CASE WHEN @OrderBy ='ProductName ASC' THEN sv.ProductName END,CASE WHEN @OrderBy ='ProductName DESC' THEN sv.ProductName END DESC,CASE WHEN @OrderBy ='ProductCode ASC' THEN sv.ProductCode END,CASE WHEN @OrderBy ='ProductCode DESC' THEN sv.ProductCode END DESC,CASE WHEN @OrderBy ='vendorName ASC' THEN sv.vendorName END,CASE WHEN @OrderBy ='vendorName DESC' THEN sv.vendorName END DESC,CASE WHEN @OrderBy ='vendorCode' THEN sv.vendorCode END,CASE WHEN @OrderBy ='ClientName' THEN sv.ClientName END

编辑:

更新了查询以适合您更新的问题.我假设你的意思是ProductCode ASC和ProductCode DESC?

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...