Order by - Dónde está el error?

13/10/2008 - 14:58 por Don Juan | Informe spam
Hola a todos.
Este es el código:
Declare @OrderBy nvarchar(50)
Set @OrderBy = 'Cust_Country'

Select
Cust_id, Cust_Serv_Rep, Cust_Type, Cust_Country,
Cust_Name
FROM Customer
ORDER BY
CASE
WHEN @OrderBy = 'Cust_id' THEN Cust_id
WHEN @OrderBy = 'Cust_Serv_Rep' THEN Cust_Serv_Rep
WHEN @OrderBy = 'Cust_Type' THEN Cust_Type
WHEN @OrderBy = 'Cust_country' THEN Cust_Country
WHEN @OrderBy = 'Cust_Name' THEN Cust_Name
END
Este es el mensaje de error que tengo al querer hacer un order by
ustilizando una variable @OrderBy

Msg 245, Level 16, State 1, Line 5
Syntax error converting the nvarchar value 'Germany' to a column of data
type int.
He revisado las columnas muchas veces y los tipos de datos están correctos
el
Cust_id - INT,
Cust_Serv_Rep - nvarchar(50),
Cust_Type - nchar(20),
Cust_Country - nvarchar(50),
Cust_Name - nvarchar(250)
Cuando hago el Order by Cust_Country no tengo ningún problema los campos son
ordenados.
Cuando uso el CASE y ordeno una columna de tipo entero como el Cust_ID no
tengo problema, el problema es cuando quiero ordenar un tipo nvarchar o
char.

Si alguien puede darme una mano le agradeceré mucho, de lo contrario lo que
ando buscando es una forma de ordenar cuando el SQL recive una variable la
cual será el campo de orden.

1000 gracias!
 

Leer las respuestas

#1 Juan Diego Bueno
13/10/2008 - 15:16 | Informe spam
Hola Juan:

On 13 oct, 14:58, "Don Juan" wrote:
Hola  a todos.
Este es el código:
Declare @OrderBy nvarchar(50)
Set @OrderBy = 'Cust_Country'

Select
    Cust_id,     Cust_Serv_Rep,       Cust_Type,    Cust_Country,
Cust_Name
FROM   Customer
ORDER BY
    CASE
        WHEN @OrderBy = 'Cust_id'  THEN Cust_id
        WHEN @OrderBy = 'Cust_Serv_Rep' THEN Cust_Serv_Rep
        WHEN @OrderBy = 'Cust_Type'  THEN Cust_Type
        WHEN @OrderBy = 'Cust_country' THEN Cust_Country
        WHEN @OrderBy = 'Cust_Name'  THEN Cust_Name
    END
Este es el mensaje de error que tengo al querer hacer un order by
ustilizando una variable @OrderBy

Msg 245, Level 16, State 1, Line 5
Syntax error converting the nvarchar value 'Germany' to a column of data
type int.
He revisado las columnas muchas veces y los tipos de datos están correctos
el
    Cust_id  - INT,
    Cust_Serv_Rep  - nvarchar(50),
    Cust_Type - nchar(20),
    Cust_Country - nvarchar(50),
    Cust_Name - nvarchar(250)
Cuando hago el Order by Cust_Country no tengo ningún problema los campos son
ordenados.
Cuando uso el CASE y ordeno una columna de tipo entero como el Cust_ID no
tengo problema, el problema es cuando quiero ordenar un tipo nvarchar o
char.

Si alguien puede darme una mano le agradeceré mucho, de lo contrario lo que
ando buscando es una forma de ordenar cuando el SQL recive una variable la
cual será el campo de orden.



Creo que tu problema reside en que usas el parámetro para un campo de
la query, cuando (que yo sepa) sólo puedes usarlo para valores.

Mecanismos para solucionar esto:

- Hacer el case en T-SQL dentro de una función de usuario que te
devuelva un tipo tabla con el resultado de la query. Eso sí, vas a
tener que hacer por cada case una query prácticamente idéntica excepto
en la parte del order by.
- Usar SQL Dinámico: Sería crear un procedimiento almacenado que
devuelva también ese resultado y generar la query dinámicamente.
Generarías una query dinámica que sustituyera el valor de @orderby por
el nombre del campo que desees. Para ello, revisa la sintaxis de
sp_executesql. Si te propongo el SP para ésto es porque las funciones
de usuario no permiten la ejecución dinámica de SQL. Un inconveniente
que puedes encontrar en esto es que pudiera haber inyección de código
SQL. Una forma simple de impedir esto es evaluar si @orderby es un
nombre de columna válido, haciendo una query sobre las vistas del
sistema (sys.columns o information_schema.columns) comprobando que
efectivamente, ese nombre de columna existe.

Un saludo

Preguntas similares