Error de conversión de SQL error
-
06-07-2019 - |
Pregunta
Cuando llamo a este procedimiento almacenado:
ALTER PROCEDURE [dbo].[GetSorted]
(
@OrderByColumn nvarchar(256)
)
AS
SET NOCOUNT ON
SELECT itDocs.AddedDate, itDocs.AddedBy FROM itDocs
ORDER BY
CASE WHEN @OrderByColumn='AddedDate' THEN itDocs.AddedDate
WHEN @OrderByColumn='AddedBy' THEN itDocs.AddedBy
END ASC
Me sale un error:
La conversión falló al convertir la fecha y / o el tiempo de la cadena de caracteres
.
Así es como llamo a SP:
DECLARE @return_value int
EXEC @return_value = [dbo].[GetSorted]
@OrderByColumn = 'AddedBy'
SELECT 'Return Value' = @return_value
GO
ACTUALIZACIÓN: Si utilizo el enfoque de casos múltiples como se sugiere en las respuestas de fist 2, Recibo un error al intentar agregar otro caso para orientación:
ORDER BY
CASE WHEN @OrderDirection=0 THEN
CASE WHEN @OrderByColumn='AddedDate' THEN itDocs.AddedDate END ASC,
CASE WHEN @OrderByColumn='AddedBy' THEN itDocs.AddedBy END ASC
end
CASE WHEN @OrderDirection=1 THEN
Solución
Aquí hay un buen artículo que explica el error que está recibiendo:
Uso de CASE en la cláusula ORDER BY
Puede cambiar su procedimiento almacenado a lo siguiente para permitir que funcione el CASO en la cláusula ORDER BY (ahora editado para incluir la dirección del pedido como parámetro):
ALTER PROCEDURE [dbo].[GetSorted]
(
@OrderByColumn nvarchar(256),
@OrderDirection int
)
AS
SET NOCOUNT ON
SELECT itDocs.AddedDate, itDocs.AddedBy FROM itDocs
ORDER BY
CASE WHEN @OrderByColumn='AddedDate' AND @OrderDirection=0 THEN itDocs.AddedDate END ASC,
CASE WHEN @OrderByColumn='AddedBy' AND @OrderDirection=0 THEN itDocs.AddedBy END ASC,
CASE WHEN @OrderByColumn='AddedDate' AND @OrderDirection=1 THEN itDocs.AddedDate END DESC,
CASE WHEN @OrderByColumn='AddedBy' AND @OrderDirection=1 THEN itDocs.AddedBy END DESC
Otros consejos
Está intentando convertir tipos de datos y datetime tiene una prioridad más alta. Básicamente, " AddedBy = 'bob' " no se puede convertir ...
SELECT
itDocs.AddedDate, itDocs.AddedBy
FROM
itDocs
ORDER BY
CASE OrderByColumn WHEN 'AddedDate' THEN itDocs.AddedDate ELSE '19000101' END,
CASE OrderByColumn WHEN 'AddedBy' THEN itDocs.AddedBy ELSE '' END