Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-03-2013
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Question ClientDataset cambiar tipo de parametro

Buenas foro.

Acudiendo a sus experiencias y soluciones...

Uso el SQL Server 2008, allí tengo una tabla de un aproximado de 16 millones de filas.

Una de sus columnas es de tipo char(8) y es el PK..

Para usar esta tabla, tengo un adoQuery y el sql es:
Código SQL [-]
select * from nro_key = :nro_key

el adoQuery tiene parametro "nro_key" de tipo ftString.

Acá viene mi pesadilla

1.- Utilizando profiler me doy cuenta que la sentencia es enviada al server de la siguiente forma:

Código SQL [-]
exec sp_executesql N'
select * from  padron 
where nro_key = @P1  ',N'@P1 nvarchar(8)',N'00148894'
y demora 25 segundos para darme el resultado.

2.- Como manager utilizo el EMS y eh digitado en duro:
Código SQL [-]
select * from  padron where nro_key = '00148894'
El resultado es menos de un segundo.

3.- Si yo modifico la primera sentencia y cambio el tipo de parámetro por varchar(8)
Código SQL [-]
exec sp_executesql N'
select * from  padron 
where nro_key = @P1  ',N'@P1 varchar(8)',N'00148894'
El resultado también es una bala como en el punto 2.

//------------

Entonces me pregunto, existe alguna forma de cambiar el tipo de dato en el parámetro del adoQuery para que no sea nvarchar(8) y que sea varchar(8) o char(8).

O tengo que pensar de otra forma?

A la espera de sus comentarios, criticas y regalos...


Your friend

Startkill
Lima-Perú
Responder Con Cita
  #2  
Antiguo 02-03-2013
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Replanteando mi duda

Uso el SQL Server 2008, allí tengo una tabla de un aproximado de 16 millones de filas.

Una de sus columnas es de tipo char(8) y es el PK..

Para usar esta tabla, tengo un adoQuery y el sql es:
Código SQL [-]
select * from nro_key = :nro_key
El componente adoQuery tiene parametro "nro_key" de tipo ftString.

Pruebas con el query anterior

1.- Asigno un valor al parámetro de mi sentencia contenida en el adoQuery.
Utilizo profiler para ver la sentencia que envía al server que es la siguiente:
Código SQL [-]
exec sp_executesql N'
select * from  padron 
where nro_key = @P1  ',N'@P1 nvarchar(8)',N'00148894'
Demora 25 segundos para darme el resultado.

2.- Abro el " management studio" y tipeo en duro los siguiente:
Código SQL [-]
select * from  padron where nro_key = '00148894'
El resultado es menos de un segundo.

3.- Nuevamente en el "management studio" copio la instrucción que capturé con el profiler, pero le hago un pequeño cambio:
Cambio el tipo de parametro de nvarchar(8) a varchar(8)
Código SQL [-]
exec sp_executesql N'
select * from  padron 
where nro_key = @P1  ',N'@P1 varchar(8)',N'00148894'
El resultado es veloz como en el punto 2.

//------------

Por lo que me doy cuenta el Delphi me crea la instrucción y la envía al Sql Server.
Mi duda es: Hay forma de indicar en el adoQuery que el parámetro para "nro_key" sea de tipo varchar(8)?

Lo que no comprendo es: Mi columna PK es de tipo char(8), por que Delphi crea la instrucción con un parametro de tipo nvarchar(8)?

Select original en el adoQuery
Código SQL [-]
select * from nro_key = :nro_key

Select enviado por delphi al SQL Server
Código SQL [-]
exec sp_executesql N'
select * from  padron 
where nro_key = @P1  ',N'@P1 nvarchar(8)',N'00148894'



A la espera de sus comentarios, criticas y regalos...


Your friend

Startkill
Lima-Perú
Responder Con Cita
  #3  
Antiguo 02-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Quizá funcione cambiando el tipo de parámetro de ftString a ftFixedChar.

Saludos.
Responder Con Cita
  #4  
Antiguo 02-03-2013
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Hola Al González

Gracias por responder...

Hice el cambio ftString por ftFixedChar, en modo diseño la activo la adoQuery y la sentencia es óptima para las búsquedas
Código SQL [-]
exec sp_executesql N'select * from padron where nro_key = @P1 ',N'@P1 char(8)',N'00001426'

Pero cuando compilo y lo ejecuto, nuevamente la sentencia es con nvarchar(8)
Código SQL [-]
exec sp_executesql N'select * from padron where nro_key = @P1 ',N'@P1 nvarchar(8)',N'00001426'

Tanto en el adoQuery y en ClientDataset me percaté que el tipo de dato del parámetro sea ftFixedChar.

Y solo, para salir de la duda hice pruebas de activar adoQuery y ClientDatSet en modo diseño y en el profiler se aprecia que usa char(8)

En resumen: Aun estoy "mali-muerto" con esta búsqueda

Your friend

StartKill
Lima-Perú
Responder Con Cita
  #5  
Antiguo 03-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¿Te refieres a que en tiempo de diseño genera internamente una instrucción diferente a la que genera en tiempo de ejecución? Eso sí está MUY interesante.
Responder Con Cita
  #6  
Antiguo 03-03-2013
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Hola Al González.

Eso exactamente, son diferentes las instrucciones en tiempo de diseño y de ejecución.

Para solucionar este problema de búsqueda en el adoQuery armo de forma dinámica el query, es decir ya no manejo parametro con adoQuery


(si está mal la instrucción, la estoy haciendo de memoria, pero la idea es esa..)
Código Delphi [-]
sqlText:='select * from padron where nro_key='+char(39)+editKey.text+char(39)

Controlo que editKey no sea mas de 8 caracteres, que solo sean números... por la injeciones.

Al final me quedó el sabor amargo de este inconveniente?

Ss.

StartKill
//---------
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Parametro null ClientDataSet Rockin MS SQL Server 2 29-06-2011 09:34:15
Error en Coalesce de un Parámetro tipo Int64 gluglu Firebird e Interbase 42 17-06-2011 02:47:15
Método tem parametro do tipo sysint Paulao Varios 2 16-09-2010 21:20:15
Parametro a todos los objetos de un tipo amadis OOP 1 06-10-2007 17:46:47
Parametro Tipo BIGINT Stored Procedure hibero Firebird e Interbase 5 13-04-2004 19:49:31


La franja horaria es GMT +2. Ahora son las 09:29:29.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi