SQL SERVER中的顺序和大小写
我需要在存储过程中具有order by功能。一个值被发布到一个Web服务,基于该值,我必须以某种方式对结果进行排序,即 ColName过帐时,按ColName下单 当ColName2被ColName2过帐时 我正在研究用例,但我发现了一个错误: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
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!