Declaración de caso en SQL Row_number () La cláusula Order By no funciona en los valores varchar e int
-
06-07-2019 - |
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?
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.