0

为什么这不起作用?

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

但是,如果您在 Case 语句中将 ShipNo 转换为 varchar,它会起作用吗?

4

2 回答 2

4

我知道这是旧帖子,但这适用于任何遇到此问题并正在寻找解决方案的人:

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

基本上,您将每个字段放在自己的情况下。仅当它们的数据类型或字段内的值对于两列都不同或出现错误时才执行此操作,例如

尝试将 int 转换为 varchar 或将 varchar 转换为 int 时转换失败。

于 2010-04-30T14:46:54.090 回答
1

来自在线书籍:

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

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

所以 Supplier 和 ShipNo 必须是相同的数据类型。

于 2008-11-06T11:34:44.047 回答