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!