CONVERT

27/06/2006 - 22:54 por David Baez | Informe spam
Buenas Tardes

Tengo una duda en este momento, tengo dos sentencias que utilizan variables
y las variables estan mal definidas, esto quiere decir que compara un campo
de tipo INT con una variable de tipo FLOAT, la duda va a que en una realiza
el CONVERT al campo y en la otra realiza el convert a la variable.

¿A que se debe esto?
¿Como sabe el motor a cual debe realizar el CONVERT?

Preguntas similare

Leer las respuestas

#1 Maxi
28/06/2006 - 02:01 | Informe spam
Hola, francamente no logro entenderte, si nos copias la sentencia a la que
haces referencia podria ayudarte mejor.



Salu2

Micrsoft MVP SQL Server
www.sqlgururs.org


"David Baez" wrote in message
news:
Buenas Tardes

Tengo una duda en este momento, tengo dos sentencias que utilizan
variables
y las variables estan mal definidas, esto quiere decir que compara un
campo
de tipo INT con una variable de tipo FLOAT, la duda va a que en una
realiza
el CONVERT al campo y en la otra realiza el convert a la variable.

¿A que se debe esto?
¿Como sabe el motor a cual debe realizar el CONVERT?
Respuesta Responder a este mensaje
#2 qwalgrande
28/06/2006 - 07:31 | Informe spam
Hola.

Por una parte, tenemos los motivos por los que el motor elige en cada caso
lo que convierte para hacer posible la transformación, que se debe a cómo
parametriza cada consulta y, en caso de tener un plan de ejecución en caché,
qué valores se le suministraron a la sentencia que generó ese plan.

Pero esto es secundario. Tienes que ponérselo fácil al motor, usa variables
adecuadas en cada caso, que sean del mismo tipo que las columnas con las que
lo vas a comparar. Si por el motivo que fuera, la variable viene en un tipo
que no es el idóneo, realiza la conversión tú. En lo que a rendimiento se
refiere, si realizas tú la conversión manualmente te aseguras que el motor
no tratará de convertir el tipo del campo, facilitando el uso más efectivo
de posibles índices que pueda haber definidos para el campo.

Un ejemplo:

create table Ejemplo (id int, Numero int)

create nonclustered index IX_Ejemplo on Ejemplo (Numero)

(relleno la tabla)

declare @var float
select @var = 45.0
select id, Numero from Ejemplo where Numero = @var

índice IX_Ejemplo para hacer un index seek, bueno para el rendimiento)
el índice IX_Numero para hacer un index scan, malo para el rendimiento)

declare @var float
select @var = 45.0
select id, Numero from Ejemplo where Numero = cast(@var as int)

declare @var int
select @var = 45
select id, Numero from Ejemplo where Numero = @var

Lo ideal es usar el caso C y si no puedes, usa el B.

Alberto López Grande (qwalgrande)


"David Baez" escribió en el mensaje
news:
Buenas Tardes

Tengo una duda en este momento, tengo dos sentencias que utilizan
variables
y las variables estan mal definidas, esto quiere decir que compara un
campo
de tipo INT con una variable de tipo FLOAT, la duda va a que en una
realiza
el CONVERT al campo y en la otra realiza el convert a la variable.

¿A que se debe esto?
¿Como sabe el motor a cual debe realizar el CONVERT?
Respuesta Responder a este mensaje
#3 Miguel Egea
28/06/2006 - 12:50 | Informe spam
Sql puede hacer conversiones implicitas entre tipos de datos, y lo más
probable es que esas conversiones las esté decidiendo por la precedencia
interna de los tipos. La solución obvia es que uses los tipos adecuados,
Alberto te ha puesto un excelente ejemplo. En los libros en pantalla si
buscas por conversión automática de tipos verás que tienes la información
bastante detallada.

Saludos
Miguel Egea
"David Baez" escribió en el mensaje
news:
Buenas Tardes

Tengo una duda en este momento, tengo dos sentencias que utilizan
variables
y las variables estan mal definidas, esto quiere decir que compara un
campo
de tipo INT con una variable de tipo FLOAT, la duda va a que en una
realiza
el CONVERT al campo y en la otra realiza el convert a la variable.

¿A que se debe esto?
¿Como sabe el motor a cual debe realizar el CONVERT?
Respuesta Responder a este mensaje
#4 David Baez
28/06/2006 - 15:57 | Informe spam
De antemano muchas gracias.

Es que las sentencias son de un proveedor y necesitábamos mas información
que nos ayudara a darle una respuesta ya que el proveedor tenia la duda o
quería saber por que en algunas ocasiones realiza por el CONVERT por el campo
de comparación y en otras ocasiones realiza el CONVERT sobre la variable.

Cabe de aclarar que son sentencias diferentes cuando el plan de ejecución
realiza el CONVERT por el campo y el CONVERT por la variable.

De todas formas ya le recomendamos al proveedor que modifique las variables
de entrada y que sean del mismo tipo.

Esta realiza el convert por el CAMPO

exec sp_executesql N'SELECT
COF_CONC,COF_CTEC,COF_CLIB,COF_CSEC,COF_CPRC,ITE_CONT,COF_CONT FROM
IN_COFIN,IN_UBICA
WHERE IN_COFIN.EMP_CODI = @P1
AND IN_COFIN.INS_CONT = @P2
AND IN_COFIN.BOD_CODI = @P3
AND COF_CONC <> 0
AND (((COF_CONC = 3 AND COF_INRE = ''T''))
OR COF_CONC >= 0)
AND COF_INRE <> ''J''
AND IN_COFIN.EMP_CODI = IN_UBICA.EMP_CODI
AND IN_COFIN.UBI_CONT = IN_UBICA.UBI_CONT
AND IN_UBICA.TRU_CONT =@P4', N'@P1 money,@P2 money,@P3 money,@P4 money',
$26.0000, $1.0000, $1.0000, $900.0000

Esta realiza el convert por la variable

exec sp_executesql N'SELECT
PE_MDPED.EMP_CODI,PE_MDPED.MDP_CONT,PE_MDPED.PED_CONT,PE_MDPED.PRO_CONT,PE_MDPED.PRO_SUST,PE_MDPED.BOD_CONT,PE_MDPED.LIP_CONT,PE_MDPED.UNI_CODI,PE_MDPED.MDP_CANT,PE_MDPED.MDP_PRLI,

PE_MDPED.MDP_VALO,PE_MDPED.MDP_PRMA,PE_MDPED.MDP_TIDE,PE_MDPED.MDP_PVDE,PE_MDPED.MDP_VADE,PE_MDPED.MDP_DEPP,PE_MDPED.MDP_DESC,PE_MDPED.MDP_CPIK,PE_MDPED.MDP_CCON,PE_MDPED.MDP_CDES,

PE_MDPED.MDP_CFAC,PE_MDPED.MDP_PROM,PE_MDPED.MDP_BONI,PE_MDPED.MDP_ESTA,PE_MDPED.MDP_ORDC,

PE_PEDIM.INS_CONT,PE_PEDIM.TOP_CODI,PE_PEDIM.ACT_CONT,PE_PEDIM.MON_CODI,FA_CLIEN.TCL_CODI,PE_PEDIM.UNN_CONT,PE_PEDIM.CLI_CODI,PE_PEDIM.DCL_CODD,PE_PEDIM.PED_FECH,PE_PEDIM.PED_FECH,IN_PRODU.PRO_CODI,IN_BODEG.BOD_CODI,IN_PRODU.PRO_CLNG,

FA_CLIEN.CLI_PRIO,FA_CLIEN.CLI_SUIT,FA_CLIEN.CLI_MULT,FA_CLIEN.CLI_DIAL,FA_CLIEN.CLI_DVIG,FA_CLIEN.CLI_PLIN,FA_CLIEN.CLI_FPEC,FA_CLIEN.BOD_DEST,
PE_PEDIM.PED_NUME,FA_CLIEN.CLI_BACK
FROM PE_MDPED,PE_PEDIM,IN_PRODU,IN_BODEG,PE_CLASE,FA_CLIEN,PE_MTIPO
WHERE PE_MDPED.EMP_CODI = PE_PEDIM.EMP_CODI
AND PE_MDPED.PED_CONT = PE_PEDIM.PED_CONT
AND PE_MDPED.EMP_CODI = IN_PRODU.EMP_CODI
AND PE_MDPED.PRO_CONT = IN_PRODU.PRO_CONT
AND PE_MDPED.EMP_CODI = IN_BODEG.EMP_CODI
AND PE_MDPED.BOD_CONT = IN_BODEG.BOD_CONT
AND PE_PEDIM.EMP_CODI = PE_CLASE.EMP_CODI
AND PE_PEDIM.CLA_CONT = PE_CLASE.CLA_CONT
AND PE_PEDIM.EMP_CODI = FA_CLIEN.EMP_CODI
AND PE_PEDIM.CLI_CODI = FA_CLIEN.CLI_CODI
AND PE_PEDIM.EMP_CODI = PE_MTIPO.EMP_CODI
AND PE_PEDIM.MTI_CONT = PE_MTIPO.MTI_CONT
AND PE_CLASE.CLA_PIKI = ''S''
AND PE_MTIPO.MTI_SALD = ''S''
AND PE_MDPED.MDP_BONI = ''N''
AND PE_MDPED.PRO_CONT <> 0
AND (PE_MDPED.MDP_ESTA = ''G'')
AND PE_PEDIM.EMP_CODI = @P1
AND PE_PEDIM.PED_NUME BETWEEN @P2 AND @P3
ORDER BY FA_CLIEN.CLI_PRIO,PE_PEDIM.PED_CONT,PE_PEDIM.PED_FECH', N'@P1
money,@P2 money,@P3 money', $94.0000, $8288.0000, $8288.0000


"Miguel Egea" escribió:

Sql puede hacer conversiones implicitas entre tipos de datos, y lo más
probable es que esas conversiones las esté decidiendo por la precedencia
interna de los tipos. La solución obvia es que uses los tipos adecuados,
Alberto te ha puesto un excelente ejemplo. En los libros en pantalla si
buscas por conversión automática de tipos verás que tienes la información
bastante detallada.

Saludos
Miguel Egea
"David Baez" escribió en el mensaje
news:
> Buenas Tardes
>
> Tengo una duda en este momento, tengo dos sentencias que utilizan
> variables
> y las variables estan mal definidas, esto quiere decir que compara un
> campo
> de tipo INT con una variable de tipo FLOAT, la duda va a que en una
> realiza
> el CONVERT al campo y en la otra realiza el convert a la variable.
>
> ¿A que se debe esto?
> ¿Como sabe el motor a cual debe realizar el CONVERT?



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