2008-11-06 90 views
0

爲什麼不能正常工作?SQL中的case語句Rownumber()Order By子句對varchar和int值不起作用

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,它會工作嗎?

回答

3

我知道這是舊的文章,但是這是任何一個誰跌倒在這一問題並尋找解決方案:

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

基本上你把每場在自己的情況。做到這一點,只有當場內的數據類型或值不同的兩列或當你得到錯誤,如

轉換試圖轉換爲int爲varchar或VARCHAR爲int時失敗..

+0

尼斯 - 你」我剛剛狙擊了答案! – digiguru 2010-05-04 16:29:04

1

從聯機叢書:

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

「else_result_expression的數據類型和任何result_expression必須相同或必須是隱式轉換。」

因此供應商和ShipNo必須是相同的數據類型。