Declaración de caso en SQL Row_number () La cláusula Order By no funciona en los valores varchar e int

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

Pregunta

¿Por qué no funciona esto?

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

Pero si arroja el ShipNo a un varchar en la declaración del Caso, ¿FUNCIONA?

¿Fue útil?

Solución

Soy consciente de que esta es una publicación antigua, pero es para cualquiera que se resuelva con este problema y esté buscando una solución:

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

básicamente está poniendo cada campo en su propio caso. Haga esto solo cuando su tipo de datos o valor dentro del campo difiera para ambas columnas o cuando reciba un error como

la conversión falló al intentar convertir int a varchar o varchar a int ..

Otros consejos

De los libros en línea:

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

" Los tipos de datos de else_result_expression y cualquier result_expression deben ser iguales o deben ser una conversión implícita. "

Entonces, Proveedor y Número de envío deben ser del mismo tipo de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top