instrução Case no SQL ROW_NUMBER () cláusula Order By não funciona em valores varchar e int

StackOverflow https://stackoverflow.com/questions/268322

Pergunta

Por que isso não funciona?

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

Mas se você lançar o ShipNo a um varchar na demonstração Caso ela não funciona?

Foi útil?

Solução

Estou ciente de que este é post antigo, mas isto é para qualquer um que cai sobre esta questão e está à procura de uma solução:

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

basicamente você está colocando cada campo em seu próprio caso. Faça isso somente quando o seu tipo de dados ou valor difere de campo dentro para ambas as colunas ou quando você está recebendo erro como

conversão falhou ao tentar converter int para varchar ou varchar para int ..

Outras dicas

A partir Books Online:

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

"Os tipos de dados de else_result_expression e qualquer result_expression deve ser o mesmo ou deve ser uma conversão implícita."

Assim, fornecedor e ShipNo deve ser o mesmo tipo de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top