2012-04-03 14 views
9

Tengo una consulta de paginación bastante simple que se usa para obtener filas de una tablaError de conversión al fecha y/o tiempo de conversión de cadena de caracteres

ALTER PROCEDURE mytable.[news_editor_paginate] 
    @count int, 
    @start int, 
    @orderby int 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT TOP (@count) * FROM 
    ( 
     SELECT news_edits.*, 
     ROW_NUMBER() OVER (
      ORDER BY CASE 
       WHEN @orderby = 0 THEN news_edits.[time] 
       WHEN @orderby = 1 THEN news_edits.lastedit 
       WHEN @orderby = 2 THEN news_edits.title 
       END 
      DESC 
     ) AS num 
     FROM news_edits 
    ) AS a 
    WHERE num > @start 
END 

El parámetro @orderby decide qué columna los resultados deben ser ordenados por.

news_edit.[time] y news_edits.lastedit son campos de fecha y hora. Pero news_edits.title es un campo varchar.

La consulta funciona bien tanto para los campos de fecha y hora, pero cuando @orderby = 2 me sale el siguiente error:

"Error de conversión al convertir fecha y/u hora de la cadena de caracteres".

El problema que estoy teniendo es que no estoy tratando de convertir nada?

Respuesta

19

You'll need to divide your ORDER BY into multiple CASE statements:

ORDER BY 
    CASE WHEN @orderby = 0 THEN news_edits.[time] END DESC, 
    CASE WHEN @orderby = 1 THEN news_edits.lastedit END DESC, 
    CASE WHEN @orderby = 2 THEN news_edits.title END DESC 

Esto se debe a una sola declaración CASE requiere que todas las ramas tienen tipos de datos compatibles. Dado que la cadena de caracteres en un CASE no se puede convertir a la fecha y hora devuelta desde otro CASE, se obtiene el error de conversión.

+0

¡Eso es todo! –

0

Como no está emitiendo explícitamente los valores de "orden por caso ...", SQL Server infiere que es una fecha y hora (según el tipo del primer caso).

La solución a su problema es emitir las fechas en un formato de cadena que le permite ordenar por ella, algo así como 'aaaaMMddhhmmss'. Si lo hace, todos los valores de "orden por caso ..." serán caracteres y funcionará.

Alternativamente, puede tener dos selecciones, y elija una de ellas con un if. La primera parte de si para las fechas, la segunda para el título.

Cuestiones relacionadas