为什么这不起作用?

DECLARE @temp table
(ShipNo int,
 Supplier varchar(10)
)

INSERT INTO @temp VALUES (1,'CFA')
INSERT INTO @temp VALUES (1, 'TFA')
INSERT INTO @temp VALUES (2, 'LRA')
INSERT INTO @temp VALUES (2, 'LRB')
INSERT INTO @temp VALUES (3, 'ABC')
INSERT INTO @temp VALUES (4, 'TFA')

Declare @OrderBy varchar(255)
sET @OrderBy = 'Supplier'



SELECT ROW_NUMBER() OVER (ORDER BY 
CASE @OrderBy
 WHEN 'Supplier' THEN Supplier
 WHEN 'ShipNo' THEN ShipNo
END
) AS RowNo,
ShipNo,
Supplier
FROM @temp

但是,如果你将ShipNo转换为Case语句中的varchar,它是否有效?

有帮助吗?

解决方案

我知道这是一个老帖子,但这适用于任何一个在这个问题上挣扎并正在寻找解决方案的人:

SELECT ROW_NUMBER() OVER (ORDER BY  
CASE @OrderBy 
 WHEN 'Supplier' THEN Supplier
END
CASE @OrderBy
 WHEN 'ShipNo' THEN ShipNo 
END 
)

基本上你将每个字段放在自己的情况下。仅当它们的数据类型或字段内的值对于两列都不同或者当您收到错误(例如

)时才执行此操作 尝试将int转换为varchar或将varchar转换为int ..

时,

转换失败

其他提示

来自联机丛书:

CASE
WHEN Boolean_expression THEN result_expression 
    [ ...n ] 
[ 
    ELSE else_result_expression 
] 
END

" else_result_expression和任何result_expression的数据类型必须相同或必须是隐式转换。“

因此,Supplier和ShipNo必须是相同的数据类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top