Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Comparacion entre tablas con store procedure

Estas en el tema de Comparacion entre tablas con store procedure en el foro de SQL Server en Foros del Web. Buenos dias, quisiera pedirles ayuda con respecto a un store procedure que estoy creando. Mi problema es el siguiente: tengo una base de datos con ...
  #1 (permalink)  
Antiguo 28/03/2011, 08:22
 
Fecha de Ingreso: marzo-2011
Ubicación: Mexico
Mensajes: 11
Antigüedad: 13 años, 1 mes
Puntos: 0
Comparacion entre tablas con store procedure

Buenos dias, quisiera pedirles ayuda con respecto a un store procedure que estoy creando. Mi problema es el siguiente: tengo una base de datos con dos tablas con la siguiente estructura

Tabla 1 : catVIP
cPrimerNombre
cSegundoNombre (opcional)
cApellidoPaterno
cApellidoMaterno

Tabla 2: tblPreCargaArchivo
cPrimerNombre
cSegundoNombre (opcional)
cApellidoPaterno
cApellidoMaterno

y utilizo el store procedure para hacer lo siguiente : la tabla de catVIP contiene los nombres de clientes a los cuales no les debo de marcar, y la tabla de tblPrecargaArchivo contiene una lista de 200000 registros de clientes aleatorios.

El store procedure hace lo siguiente : compara primero el nombre completo, y si no encuentra coincidencias, compara cada uno de los campos de la primera tabla contra cada uno de los campos de la segunda, es decir; busca el nombre de tblPrecargaArchivo en los cuatro campos de catVIP, por ejemplo por ejemplo el primer nombre de tblPrecargaArchivo en el primer nombre de catVIP, el primer nombre de tblPrecargaArchivo en el segundo nombre de catVIP y asi sucesivamente

Aqui esta el codigo del store procedure

CREATE PROCEDURE sp_ValidacionInnombrable
(@cNombre varchar(100),@cNombre2 varchar(100),@cApPaterno varchar(100), @cApMaterno varchar(100))
AS

declare
@cNombreCompleto varchar(400),
@cTamanoNombre1 int,
@cTamanoNombre2 int,
@cTamanoApPaterno int,
@cTamanoApMaterno int,
@cBanderaNombreCompleto int,
@cBanderaInnombrableNombre1Nombre int,
@cBanderaInnombrableNombre2Nombre int,
@cBanderaInnombrableApPaternoNombre int,
@cBanderaInnombrableApMaternoNombre int,
@cBanderaInnombrableNombreApPaterno int,
@cBanderaInnombrableNombre2ApPaterno int,
@cBanderaInnombrableApPaternoApPaterno int,
@cBanderaInnombrableApMaternoApPaterno int,
@cBanderaInnombrableNombreApMaterno int,
@cBanderaInnombrableNombre2ApMaterno int,
@cBanderaInnombrableApPaternoApMaterno int,
@cBanderaInnombrableApMaternoApMaterno int


---Inicializamos las banderas de busqueda
set @cTamanoNombre1 = 0
set @cTamanoNombre2 = 0
set @cTamanoApPaterno = 0
set @cTamanoApMaterno = 0

set @cBanderaNombreCompleto = 0

set @cBanderaInnombrableNombre1Nombre = 0
set @cBanderaInnombrableNombre2Nombre = 0
set @cBanderaInnombrableApPaternoNombre = 0
set @cBanderaInnombrableApMaternoNombre = 0

set @cBanderaInnombrableNombreApPaterno = 0
set @cBanderaInnombrableNombre2ApPaterno = 0
set @cBanderaInnombrableApPaternoApPaterno = 0
set @cBanderaInnombrableApMaternoApPaterno = 0

set @cBanderaInnombrableNombreApMaterno = 0
set @cBanderaInnombrableNombre2ApMaterno = 0
set @cBanderaInnombrableApPaternoApMaterno = 0
set @cBanderaInnombrableApMaternoApMaterno = 0


----Primero realizamos la comparativa entre el nombre completo del innombrable y el nombre completo
SELECT @cNombreCompleto =UPPER(LTRIM(RTRIM(@cNombre)))+'*'+UPPER(LTRIM(RTR IM(@cNombre2)))+'*'+UPPER(LTRIM(RTRIM(@cApPaterno) ))+'*'+UPPER(LTRIM(RTRIM(@cApMaterno)))

---Habilitamos la bandera de nombre completo
SELECT @cBanderaNombreCompleto = 1 FROM catVIP WHERE cEstatus IS NULL AND (UPPER(LTRIM(cNombre))+' '+UPPER(LTRIM(cNombre2))+'*'+UPPER(LTRIM(cPaterno) )+'*'+UPPER(LTRIM(cMaterno))) LIKE @cNombreCompleto

---Si no cumple con el parametro de nombre completo, comparamos campo con campo
IF @cBanderaNombreCompleto = 0
BEGIN
----Comparativa del primer nombre
SELECT @cTamanoNombre1 = LEN(@cNombre)

----Si hay nombre capturado en el store procedure
if @cTamanoNombre1 > 0
begin
----Nombre 1 innombrable contra Nombre
SELECT @cBanderaInnombrableNombre1Nombre = 1 FROM catVIP WHERE cEstatus IS NULL AND cNombre IS NOT NULL AND (LTRIM(RTRIM(UPPER(cNombre)))=UPPER(LTRIM(RTRIM(@c Nombre))))
----Nombre 2 innombrable contra Nombre
SELECT @cBanderaInnombrableNombre2Nombre = 1 FROM catVIP WHERE cEstatus IS NULL AND cNombre2 IS NOT NULL AND LTRIM(RTRIM(UPPER(cNombre2)))=UPPER(LTRIM(RTRIM(@c Nombre)))
---Apellido Paterno innombrable contra nombre
SELECT @cBanderaInnombrableApPaternoNombre = 1 FROM catVIP WHERE cEstatus IS NULL AND cPaterno IS NOT NULL AND LTRIM(RTRIM(UPPER(cPaterno)))=UPPER(LTRIM(RTRIM(@c Nombre)))
---Apellido Materno Innombrable contra nombre
SELECT @cBanderaInnombrableApMaternoNombre = 1 FROM catVIP WHERE cEstatus IS NULL AND cPaterno IS NOT NULL AND LTRIM(RTRIM(UPPER(cPaterno)))=UPPER(LTRIM(RTRIM(@c Nombre)))
end

----Comparativa del apellido paterno
SELECT @cTamanoApPaterno= LEN(@cApPaterno)
if @cTamanoApPaterno > 0
begin
----Nombre 1 innombrable contra apellido paterno
SELECT @cBanderaInnombrableNombreApPaterno = 1 FROM catVIP WHERE cEstatus IS NULL AND cNombre IS NOT NULL AND LTRIM(RTRIM(UPPER(cNombre)))=UPPER(LTRIM(RTRIM(@cA pPaterno)))
----Nombre 2 innombrable contra apellido paterno
SELECT @cBanderaInnombrableNombre2ApPaterno = 1 FROM catVIP WHERE cEstatus IS NULL AND cNombre2 IS NOT NULL AND LTRIM(RTRIM(UPPER(cNombre2)))=UPPER(LTRIM(RTRIM(@c ApPaterno)))
----Apellido paterno innombrable contra apellido paterno
SELECT @cBanderaInnombrableApPaternoApPaterno = 1 FROM catVIP WHERE cEstatus IS NULL AND cPaterno IS NOT NULL AND LTRIM(RTRIM(UPPER(cPaterno)))=UPPER(LTRIM(RTRIM(@c ApPaterno)))
----Apellido Materno innombrable contra apellido paterno
SELECT @cBanderaInnombrableApMaternoApPaterno = 1 FROM catVIP WHERE cEstatus IS NULL AND cMaterno IS NOT NULL AND LTRIM(RTRIM(UPPER(cMaterno)))=UPPER(LTRIM(RTRIM(@c ApPaterno)))
end

---Comparativa del apellido materno
SELECT @cTamanoApMaterno= LEN(@cApMaterno)
if @cTamanoApMaterno > 0
begin
----Nombre 1 innombrable contra apellido paterno
SELECT @cBanderaInnombrableNombreApMaterno = 1 FROM catVIP WHERE cEstatus IS NULL AND cNombre IS NOT NULL AND LTRIM(RTRIM(UPPER(cNombre)))=UPPER(LTRIM(RTRIM(@cA pMaterno)))
----Nombre 2 innombrable contra apellido paterno
SELECT @cBanderaInnombrableNombre2ApMaterno = 1 FROM catVIP WHERE cEstatus IS NULL AND cNombre2 IS NOT NULL AND LTRIM(RTRIM(UPPER(cNombre2)))=UPPER(LTRIM(RTRIM(@c ApMaterno)))
----Apellido paterno innombrable contra apellido paterno
SELECT @cBanderaInnombrableApPaternoApMaterno = 1 FROM catVIP WHERE cEstatus IS NULL AND cPaterno IS NOT NULL AND LTRIM(RTRIM(UPPER(cPaterno)))=UPPER(LTRIM(RTRIM(@c ApMaterno)))
----Apellido Materno innombrable contra apellido paterno
SELECT @cBanderaInnombrableApMaternoApMaterno = 1 FROM catVIP WHERE cEstatus IS NULL AND cMaterno IS NOT NULL AND LTRIM(RTRIM(UPPER(cMaterno)))=UPPER(LTRIM(RTRIM(@c ApMaterno)))
end
END ----Fin si la bandera de nombre completo no se activa

----Seleccionamos al final las banderas de comparacion
SELECT cTotalBanderas =@cBanderaNombreCompleto+@cBanderaInnombrableNombr e1Nombre+@cBanderaInnombrableNombre2Nombre+@cBande raInnombrableApPaternoNombre+@cBanderaInnombrableA pMaternoNombre+@cBanderaInnombrableNombreApPaterno +@cBanderaInnombrableNombre2ApPaterno+@cBanderaInn ombrableApPaternoApPaterno+@cBanderaInnombrableApM aternoApPaterno+@cBanderaInnombrableNombreApMatern o+@cBanderaInnombrableNombre2ApMaterno+@cBanderaIn nombrableApPaternoApMaterno+@cBanderaInnombrableAp MaternoApMaterno,
cBanderaNombreCompleto = @cBanderaNombreCompleto ,
cBanderaInnombrableNombre1Nombre = @cBanderaInnombrableNombre1Nombre,
cBanderaInnombrableNombre2Nombre = @cBanderaInnombrableNombre2Nombre,
cBanderaInnombrableApPaternoNombre = @cBanderaInnombrableApPaternoNombre,
cBanderaInnombrableApMaternoNombre = @cBanderaInnombrableApMaternoNombre,
cBanderaInnombrableNombreApPaterno = @cBanderaInnombrableNombreApPaterno,
cBanderaInnombrableNombre2ApPaterno = @cBanderaInnombrableNombre2ApPaterno,
cBanderaInnombrableApPaternoApPaterno = @cBanderaInnombrableApPaternoApPaterno,
cBanderaInnombrableApMaternoApPaterno = @cBanderaInnombrableApMaternoApPaterno,
cBanderaInnombrableNombreApMaterno = @cBanderaInnombrableNombreApMaterno,
cBanderaInnombrableNombre2ApMaterno = @cBanderaInnombrableNombre2ApMaterno,
cBanderaInnombrableApPaternoApMaterno = @cBanderaInnombrableApPaternoApMaterno,
cBanderaInnombrableApMaternoApMaterno = @cBanderaInnombrableApMaternoApMaterno
GO

La ultima sentencia regresa un juego de banderas para saber si entra dentro de la categoria de innombrable o no.

Mi pregunta es ¿Como puedo optimizar este codigo para que en tarde menos y no lo tenga que hacer registro por registro, sino que afecte a toda la tabla lo mas rapido posible? Se aceptan sugerencias. !Gracias!
  #2 (permalink)  
Antiguo 28/03/2011, 11:00
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Comparacion entre tablas con store procedure

¿Porque no dejas en una tabla ADICIONAL, todos aquellos que SI cumplen con tus filtros y de ahi tomas ya el registro SEGURO al que debes de marcar?

¿porque hacerlo de uno por uno?
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 28/03/2011, 13:25
 
Fecha de Ingreso: marzo-2011
Ubicación: Mexico
Mensajes: 11
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Comparacion entre tablas con store procedure

He aqui la razon por la que hago el recorrido uno por uno:

Supongamos que en catVIP tengo el siguiente registro

cPrimerNombre cApellidoPaterno cApellidoMaterno
Raul Benitez Benitez

y en la tabla tblPrecargaArchivo tengo los siguientes registros
cPrimerNombre cApellidoPaterno cApellidoMaterno
Raul Benitez Juarez
Raul Juarez Benitez
Daniela Benitez Juarez
Benitez Juarez Raul

En este caso en particular los dos primeros registros cumplen con al menos una de las condiciones, en este caso apellido similar. El tercero puede ser o no familiar del cliente al que no le quiero marcar y el cuarto por default esta mal capturado.

En este ejemplo y de acuerdo a las validaciones que tengo, los cuatro deberan de quedar fuera de la base (eliminar el registro).

Pero el problema que tengo es como agilizar esas validaciones para que sean mas rapidas al comparar contra una base grande.
  #4 (permalink)  
Antiguo 28/03/2011, 13:50
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Comparacion entre tablas con store procedure

Si hay decisiones que solo con verlas (tu) sabes que NO cumplen con los requisitos, es muy dificil que un MOTOR DE BASE de datos tome esas decisiones por ti.

Si existe alguna forma mediante un WHERE, SELECT, etc, de identificar esas "reglas de negocio", lo podras hacer sin ningun problema.

Pero perdoname que insista, SQL Server (y muchos otros motores) son "torpes" para manejar "registro x registro", debes pensar en GRUPO DE REGISTROS, por eso mi insistencia de que seria mucho mejor que crearas una tercera tabla, ya con los datos filtrados y listos para usarse y no hacerlo en el memento.
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 28/03/2011, 14:53
 
Fecha de Ingreso: marzo-2011
Ubicación: Mexico
Mensajes: 11
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Comparacion entre tablas con store procedure

Ok, voy a implementarlo con una tabla temporal y veremos como funciona.
!Gracias!

Etiquetas: procedimiento
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:32.