Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 SERVER中的顺序和大小写_Sql_Sql Server_Sql Order By_Case - Fatal编程技术网

SQL SERVER中的顺序和大小写

SQL SERVER中的顺序和大小写,sql,sql-server,sql-order-by,case,Sql,Sql Server,Sql Order By,Case,我需要在存储过程中具有order by功能。一个值被发布到一个Web服务,基于该值,我必须以某种方式对结果进行排序,即 ColName过帐时,按ColName下单 当ColName2被ColName2过帐时 我正在研究用例,但我发现了一个错误: Incorrect syntax near '@version' ORDER BY CASE WHEN @OrderBy ='Seller (code)' THEN A_SNO WHEN @OrderBy ='Lot' THEN A

我需要在存储过程中具有order by功能。一个值被发布到一个Web服务,基于该值,我必须以某种方式对结果进行排序,即

ColName过帐时,按ColName下单 当ColName2被ColName2过帐时

我正在研究用例,但我发现了一个错误:

  Incorrect syntax near '@version' 
  ORDER BY CASE 
  WHEN @OrderBy ='Seller (code)' THEN A_SNO 
  WHEN @OrderBy ='Lot' THEN A_LOTNO 
  WHEN @OrderBy ='Ring Type' THEN RN_NUM 
  WHEN @OrderBy ='Aim Error Code' THEN AimRejectionCode 
  ELSE A_SNO END

  DECLARE @version varchar(50)
  SET @version = (SELECT DBVERSION FROM MSYSCFG)
  PRINT 'New Version = ' + @version
很抱歉,我不熟悉这一点,并且使用sql server 2008。谢谢你的帮助 更新:提供了附加代码。当我省略最后3行时,我得到一个错误

 Incorrect synatx near END
更新2:我已将订单更改为:

ORDER BY 
    CASE @OrderBy
        WHEN @OrderBy = 'Seller (code)' THEN A_SNO
        WHEN @OrderBy = 'Lot' THEN A_LOTNO
        WHEN @OrderBy = 'Aim Error Code' THEN AimRejectionCode
    END
    , CASE @OrderBy WHEN 'Ring Type' THEN RingTypeFlag
    END
    , A_SNO
前三个是varchar,另一个是int类型。 这给了我三个“=”下的红线,错误描述如下: “=”附近的语法不正确。 以及订单下的红线,根据该红线给出以下错误说明:

'A constant expression was encountered in the ORDER BY list, position 3'

注意:当我删除最后一个
时,一个_SNO
的Order By error(按错误排序)消失了,但我仍然收到=语法错误

让我们看看这是否是您需要的:

DECLARE @t table(col1 int, col2 int, col3 int,col4 int);
DECLARE @OrderBy varchar(4) = 'Col3';

insert into @t 
values
 (1,2,3,4),
 (6,3,8,5),
 (7,4,1,7),
 (3,7,0,1),
 (9,8,3,6);

 SELECT 
     CASE @OrderBy
        WHEN 'Col2' THEN Col2
        WHEN 'Col3' THEN Col3
        WHEN 'Col4' THEN Col4
        ELSE Col1 END as OrderCol
    ,* 
 FROM @t
 ORDER BY OrderCol desc;

 SELECT * 
 from @t
 ORDER BY CASE @OrderBy
    WHEN 'Col2' THEN Col2
    WHEN 'Col3' THEN Col3
    WHEN 'Col4' THEN Col4
    ELSE Col1 END desc;
是一个表达式,必须生成一个定义良好的单一类型的结果。因此,只要所有列的类型都兼容,就可以将它们全部放在一个
CASE
表达式中

如果不是这样,那么需要将其拆分并使用多个表达式。假设
Col1
Col3
具有兼容的类型(无论是相同的类型还是您乐于将一种类型转换为另一种类型),并且
Col2
Col4
具有不兼容的类型(它们之间以及与
Col1
Col3
),那么我们需要三个表达式:

ORDER BY 
    CASE @OrderBy
        WHEN 'Col1' THEN Col1
        WHEN 'Col3' THEN Col3
    END
    , CASE @OrderBy WHEN 'Col2' THEN Col2 END
    , CASE @OrderBy WHEN 'Col4' THEN Col4 END
    , Col1
(我还包括了
Col1
的最后一个表达式,这样“回退”排序仍然会出现)

对于上面的每个
CASE
表达式,如果不匹配,则表达式返回
NULL
-并将所有
NULL
一起排序,这样整个
CASE
表达式就不会对排序产生整体影响


发件人:

返回类型 返回result_表达式中的类型集和可选的else_result_表达式中优先级最高的类型


当@OrderBy='Col1'时,按大小写排序,然后按Col1…所有col…的情况也是如此,否则按Col1END@Vinayak我已经做了更改,但仍然会遇到相同的错误好的,那么在您显示的代码之后会出现什么呢?如果删除最后三行导致报告相同的错误,但在不同的位置,那么它倾向于指示错误在您所显示的块的后面,或者如果这是代码的实际结尾,然后我建议在脚本开始时,对于一些
开始
s,应该有一个或多个
结束
s缺席。@Damien_不信者我恢复到了sp的早期版本,并更改了顺序,结果成功了。我一定是无意中删除了一些东西,尽管我仍然看不出两者有什么不同。它现在运行,但当我使用varchars时,我收到以下错误“将varchar值'31C'转换为数据类型int时转换失败”。“好的,很好。现在,您需要我发布的解决方案,其中不应该有
int
列和
varchar
列都试图为单个
CASE
表达式提供值。谢谢,我还可以在“a”时使用CASE XYZ,然后在1 else 2结束asc/desc!