Duda case ... when... then

26/10/2005 - 09:38 por Kike | Informe spam
hola Grupo:
Tengo la siguiente consulta

declare @orden varchar(40)
set @orden='numtarjeta' -- ESTE PUEDE VENIR POR 'NumTarjeta' o
'FechaInscripcion'

select
dbo.FNumTarjeta(tblinscripciones.id_tipousuario,tblinscripciones.id_usuario)
as NumTarjeta, tblinscripciones.FechaInscripcion
from tblloquesea
ORDER BY case @Orden
when 'FechaInscripcion' then FechaInscripcion
when 'NumTarjeta' then
dbo.FNumTarjeta(tblinscripciones.id_tipousuario,tblinscripciones.id_usuario)
end

el caso es que asi me da este error:
Servidor: mensaje 295, nivel 16, estado 3, línea 3
Error de sintaxis al convertir una cadena de caracteres al tipo de datos
smalldatetime.

Sin embargo si formateo FechaInscripcion a convert(varchar(10),FechaInscripcion,103) en el 'case'

se arregla y me gustaria saber porque ????? ya que si la variable orden
me viene con 'FechaInscripcion' No da error de ninguna de las formas.
¿Tienen que ser del mismo tipo?¿entonces porque si me llega con
FechaInscripcion no da error?

Muchas Gracias a todos

Preguntas similare

Leer las respuestas

#1 Carlos Sacristán
26/10/2005 - 09:47 | Informe spam
Sí, claro que tienen que ser del mismo tipo porque si no, no habría
forma de ordenarlo. Es probable que la función que estás usando devuelva un
tipo de dato que no pueda ser convertido implícitamente a SMALLDATETIME.

De todos modos, es más eficiente poner el típico "IF" y ordenarlo por el
campo que la variable te indique:

IF @orden = 'FechaInscripcion'
SELECT ... ORDER BY fechaInscripcion
ELSE IF @orden = 'numTarjeta'
SELECT ... ORDER BY
dbo.FNumTarjeta(tblinscripciones.id_tipousuario,tblinscripciones.id_usuario)



Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Kike" escribió en el mensaje
news:
hola Grupo:
Tengo la siguiente consulta

declare @orden varchar(40)
set @orden='numtarjeta' -- ESTE PUEDE VENIR POR 'NumTarjeta' o
'FechaInscripcion'

select



dbo.FNumTarjeta(tblinscripciones.id_tipousuario,tblinscripciones.id_usuario)
as NumTarjeta, tblinscripciones.FechaInscripcion
from tblloquesea
ORDER BY case @Orden
when 'FechaInscripcion' then FechaInscripcion
when 'NumTarjeta' then



dbo.FNumTarjeta(tblinscripciones.id_tipousuario,tblinscripciones.id_usuario)
end

el caso es que asi me da este error:
Servidor: mensaje 295, nivel 16, estado 3, línea 3
Error de sintaxis al convertir una cadena de caracteres al tipo de datos
smalldatetime.

Sin embargo si formateo FechaInscripcion a > convert(varchar(10),FechaInscripcion,103) en el 'case'

se arregla y me gustaria saber porque ????? ya que si la variable


orden
me viene con 'FechaInscripcion' No da error de ninguna de las formas.
¿Tienen que ser del mismo tipo?¿entonces porque si me llega con
FechaInscripcion no da error?

Muchas Gracias a todos



Respuesta Responder a este mensaje
#2 Alejandro Mesa
26/10/2005 - 15:39 | Informe spam
Kike,

Sin embargo si formateo FechaInscripcion a > convert(varchar(10),FechaInscripcion,103) en el 'case'

se arregla y me gustaria saber porque ????? ya que si la variable orden
me viene con 'FechaInscripcion' No da error de ninguna de las formas.
¿Tienen que ser del mismo tipo?¿entonces porque si me llega con
FechaInscripcion no da error?



La respuesta esta en que el tipo de dato del resultado de una expresion
"case" esta determinado por el tipo de dato de mayor precedencia de los tipos
referenciados. En tu caso, "FechaInscripcion" es "smalldatetime" y el tipo de
dato que devuelve la funcion "dbo.FNumTarjeta" debe ser char / varchar /
nchar / nvarchar, por lo que el de mayor precedencia es smalldatetime y todos
los demas tipos seran convertidos implicitamente hacia ese tipo de dato
cuando el valor de @orden haga que esa columna sea seleccionada como fuente
del "order by". Cuando uno de los valores no puede ser implicitamente
convertido al tipo de mayor precedencia, entonces sql server te da este
error. En cambio al convertir "FechaInscripcion" a "varchar" con la funcion
"convert", los tipos de datos referenciados en la expresion "case" son
iguales y por ende todo marcha correctamente.

Ejemplo:

declare @i int

set @i = 3

select orderid, orderdate, shipcountry
from dbo.orders
order by
case @i
when 1 then orderid
when 2 then orderdate
when 3 then shipcountry
end

Si el valor de @i es 1 o 2, entonces no habra problemas porque los valores
enteros que hay en la columna "orderid" pueden ser convertidos a "datetime",
pero no asi los valores de la columna "shipcountry".


AMB

"Kike" wrote:

hola Grupo:
Tengo la siguiente consulta

declare @orden varchar(40)
set @orden='numtarjeta' -- ESTE PUEDE VENIR POR 'NumTarjeta' o
'FechaInscripcion'

select
dbo.FNumTarjeta(tblinscripciones.id_tipousuario,tblinscripciones.id_usuario)
as NumTarjeta, tblinscripciones.FechaInscripcion
from tblloquesea
ORDER BY case @Orden
when 'FechaInscripcion' then FechaInscripcion
when 'NumTarjeta' then
dbo.FNumTarjeta(tblinscripciones.id_tipousuario,tblinscripciones.id_usuario)
end

el caso es que asi me da este error:
Servidor: mensaje 295, nivel 16, estado 3, línea 3
Error de sintaxis al convertir una cadena de caracteres al tipo de datos
smalldatetime.

Sin embargo si formateo FechaInscripcion a > convert(varchar(10),FechaInscripcion,103) en el 'case'

se arregla y me gustaria saber porque ????? ya que si la variable orden
me viene con 'FechaInscripcion' No da error de ninguna de las formas.
¿Tienen que ser del mismo tipo?¿entonces porque si me llega con
FechaInscripcion no da error?

Muchas Gracias a todos




email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida