Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在(ORDER BY子句上对第_NUMBER()行中的datetime进行排序_Sql_Sql Server 2005 - Fatal编程技术网

Sql 如何在(ORDER BY子句上对第_NUMBER()行中的datetime进行排序

Sql 如何在(ORDER BY子句上对第_NUMBER()行中的datetime进行排序,sql,sql-server-2005,Sql,Sql Server 2005,您好,下面的查询是一个更大的复杂查询的原型 问题是,我应该能够根据用户输入按任何顺序(即ASC和DESC)对任何列进行排序 CREATE table #Table1( Name varchar(10) PRIMARY key, DOB DateTime, Rate numeric(10,2) ) INSERT INTO #Table1 (Name,DOB,Rate) values ('Name1','2/2/2012',10.23) INSERT INTO #Table1 (Name,DO

您好,下面的查询是一个更大的复杂查询的原型 问题是,我应该能够根据用户输入按任何顺序(即ASC和DESC)对任何列进行排序

CREATE table #Table1(
Name varchar(10) PRIMARY key,
DOB DateTime,
Rate numeric(10,2)  
)

INSERT INTO #Table1 (Name,DOB,Rate) values ('Name1','2/2/2012',10.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name2','3/2/2012',120.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name3','4/2/2012',110.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name4','5/2/2012',140.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name15','6/2/2012',130.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name6','2/21/2012',1120.23)

Declare @SortColumn varchar(10)
DECLARE @SortExpression varchar (10)

SET @SortColumn = 'DOB'
SET @SortExpression = 'DESC' -- Need to sort in both ASC and DESC

Select 
            Name,
            DOB,
            Rate,
            ROW_NUMBER() OVER 
                (ORDER BY 
                    CASE WHEN @SortColumn = 'Name' then Name
                         WHEN @SortColumn = 'DOB' THEN DOB
                         WHEN @SortColumn = 'Rate' THEN Rate
                    END  +  @SortExpression 
                ) AS RowNumber  
                FROM 
                #Table1

看起来您需要
CAST()
CONVERT()
案例中的项目才能正常工作:

Declare @SortColumn varchar(10)
DECLARE @SortExpression varchar (10)

SET @SortColumn = 'DOB'
SET @SortExpression = 'DESC' -- Need to sort in both ASC and DESC

Select 
   Name,
   DOB,
   Rate,
   ROW_NUMBER() OVER 
   (ORDER BY 
       CASE WHEN @SortColumn = 'Name' then Name
            WHEN @SortColumn = 'DOB' THEN convert(char(10), DOB, 120)
            WHEN @SortColumn = 'Rate' THEN Cast(Rate as varchar(10))
       END  ASC
    ) AS RowNumberASC,
    ROW_NUMBER() OVER 
    (ORDER BY 
       CASE WHEN @SortColumn = 'Name' then Name
            WHEN @SortColumn = 'DOB' THEN convert(char(10), DOB, 120)
            WHEN @SortColumn = 'Rate' THEN Cast(Rate as varchar(10))
      END DESC
    ) AS RowNumberDESC
FROM Table1


正如@Martin指出的
ASC
DESC
不能参数化。

如果需要在
ASC
DESC
之间动态切换,则必须使用动态语句。
SQL小提琴。请注意


如果查询复杂,请考虑将其放入视图中,并允许对该部分进行编译时检查。

。单独查询可能会有更好的计划。BTW <代码> ASC 和 DESC不能在您尝试的同时进行修改,并且Case< /C> >的所有分支都需要向SA提交。me数据类型。
+@SortExpression
仅将
ASC
/
DESC
附加到已排序的字符串。它仍将被排序
ASC
@MartinSmith我不知道。从我的答案中删除。Thanks@PeterLang切换到转换
yyyy-mm-dd
解决
ASC
/
DESC问题可能是总是选择这两个列作为两个单独的列,然后再决定使用哪一列…
+1
。您甚至可以避免使用一个
排序
,使用这一点,必须测试性能,还必须测试查询的可读性;)您将无法在视图中使用动态sql,但它必须是一个存储过程。是的,恐怕没有办法把‘ASC’/‘DESC’放在一个视图中。
EXECUTE(' SELECT Name, DOB, Rate,'
      + ' ROW_NUMBER() OVER( ORDER BY ' + @SortColumn + ' ' + @SortExpression
      + ' ) AS RowNumber'
      + ' FROM Table1');