Ver Mensaje Individual
  #2 (permalink)  
Antiguo 01/04/2011, 19:36
Blade1982
 
Fecha de Ingreso: marzo-2011
Ubicación: Mexico
Mensajes: 11
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Multiple-step OLE DB errors y SQL en un store procedure

He aqui el store procedure

Código:
He aqui el store procedure:
Código:
CREATE PROCEDURE Sp_ValidacionCargaBases (@nId_Base INT, @cNombreBase VARCHAR(300), @nId_Campana INT, @cBaseExistente VARCHAR(1), @cUsuario VARCHAR(100), @cNombreArchivo VARCHAR(400), @nId_Archivo INT) AS ---Inicializamos el contador de insert

SET nocount ON 

----Variables de manejo de base
DECLARE @cAccionBase 			VARCHAR(200)
DECLARE @nId_HistoricoDetalle 		INT 		
---Variables de declaracion de comandos
DECLARE @cComandoBase 			VARCHAR(8000) 
DECLARE @cComandoEnBase 			VARCHAR(8000) 
DECLARE @cComandoActualizaNoValidados 	VARCHAR(8000) 
DECLARE @cComandoInnombrable 		VARCHAR(8000) 

----Contadores de campos llave para insertar en el resumen de carga
DECLARE @nTotalRegistros 			INT ----Contador para el total de registros
DECLARE @nTotalRegistrosSubidos 		INT ----Contador para el total de registros subidos por base
DECLARE @nTotalRegistrosNoValidados 	INT ----Contador para el total de registros no validados (con bandera de validacion ----N----)
DECLARE @nRegistrosNoCargados 		INT ----Contador para los registros que no pasaron los filtros de carga con bandera ----S----
DECLARE @nCampoLlaveVacio 			INT ----Contador para los que traen campo llave vacios
DECLARE @nCamposLlaveEnBase 		INT ----Para los registros cuyo campo llave ya se encuentra en base
DECLARE @nCampoLlaveRepetidos 		INT ----Para los campos repetidos dentro de archivo
DECLARE @nCamposLlaveSinNombre 		INT ----Contadores para los parametros de nombre (Nombre1,Nombre2,Apellido Paterno,Materno)
DECLARE @nCamposLlaveSinApPat 		INT 
DECLARE @nCamposLlaveSinApMat 		INT 
DECLARE @nCamposLlaveInnombrable 		INT ----Contador para el nombre completo si esta en catalogo innombrables por nombre
DECLARE @nCamposLlaveInmarcable 		INT ----Contador para el telefono 1 completo si esta en catalogo inmarcables
DECLARE @nCamposLlaveSinTelefono1 	INT ----Contadores si el telefono viene vacio
DECLARE @nCamposLLaveTamanoTelefono1 	INT ----Contadores para el tamaño del telefono
DECLARE @nCamposLLaveErrorTelefono1 	INT ----Contadores si el telefono no es numerico


 ----Inicializamos los contadores
SET @nTotalRegistros 				=	0
SET @nTotalRegistrosSubidos 			=	0
SET @nTotalRegistrosNoValidados 		=	0
SET @nRegistrosNoCargados 			=	0
SET @nCampoLlaveVacio 			=	0
SET @nCamposLlaveEnBase 			=	0
SET @nCampoLlaveRepetidos 			=	0
SET @nCamposLlaveSinNombre 		=	0
SET @nCamposLlaveSinApPat 			=	0
SET @nCamposLlaveSinApMat 			=	0
SET @nCamposLlaveInnombrable 		=	0
SET @nCamposLlaveInmarcable 		=	0
SET @nCamposLlaveSinTelefono1 		=	0
SET @nCamposLLaveTamanoTelefono1 		=	0
SET @nCamposLLaveErrorTelefono1 		=	0 


----Paso 1:Hacemos insercion directa de los registros que tengan bandera 'N' de validar registro
SET @cComandoActualizaNoValidados = ' INSERT INTO ' + @cNombreBase
SET @cComandoActualizaNoValidados =@cComandoActualizaNoValidados + '(nId_Base, cColumnaValidacion, cCampoLlave, cTelefono1, cTelefono2, cTelefono3, cNombre1, cNombre2, cApPaterno, cApMaterno, cDomicilio, '
SET @cComandoActualizaNoValidados =@cComandoActualizaNoValidados + 'cNumExterior, cNumInterior, cColonia, cCP, cCiudad, cEstado, cMunipDel, cRFC, dFechaNacimiento, cEmail, cIDCliente, cAdicional1, cAdicional2, '
SET @cComandoActualizaNoValidados =@cComandoActualizaNoValidados + 'cAdicional3, cAdicional4, cAdicional5, cAdicional6, cAdicional7, cAdicional8, cAdicional9, cAdicional10, cUsuarioAlta, dFechaAlta)'
SET @cComandoActualizaNoValidados =@cComandoActualizaNoValidados + 'SELECT nId_Base, cColumnaValidacion, cCampoLlave, cTelefono1, cTelefono2, cTelefono3, cNombre1, cNombre2, cApPaterno, cApMaterno, cDomicilio, cNumExterior,'
SET @cComandoActualizaNoValidados =@cComandoActualizaNoValidados + 'cNumInterior, cColonia, cCP, cCiudad, cEstado, cMunipDel, cRFC, dFechaNacimiento, cEmail, cIDCliente, cAdicional1, cAdicional2, cAdicional3, '
SET @cComandoActualizaNoValidados =@cComandoActualizaNoValidados + 'cAdicional4, cAdicional5, cAdicional6, cAdicional7, cAdicional8, cAdicional9, cAdicional10, cUsuarioAlta, dFechaAlta '
SET @cComandoActualizaNoValidados = @cComandoActualizaNoValidados + 'FROM         tmpPreCargaArchivo '
SET @cComandoActualizaNoValidados = @cComandoActualizaNoValidados + 'WHERE cEstatus IS NULL AND nId_Base=' + CAST( @nId_Base AS VARCHAR) + ' AND nId_ArchivoBase=' + CAST(@nId_Archivo AS VARCHAR) + '  AND cColumnaValidacion=''N''' 
EXEC (@cComandoActualizaNoValidados) 
-----PRINT @cComandoActualizaNoValidados

----Actualizamos la bandera de los registros no validados
UPDATE tmpprecargaarchivo
SET cbanderanovalidados = 'S'
WHERE cestatus IS NULL
  AND nid_base = @nId_Base
AND cColumnaValidacion='N'
  AND nid_archivobase = @nId_Archivo 

-----Paso 2:Fijamos las banderas del store procedure para minimizar los registros a procesar
 -----Primera bandera: La validacion del campo llave
  UPDATE tmpprecargaarchivo
  SET cbanderacampollave = 'S' WHERE cestatus IS NULL
  AND nid_base = @nId_Base
AND cColumnaValidacion='S'
  AND nid_archivobase = @nId_Archivo
  AND (ccampollave IS NULL
       OR ccampollave = ''
       OR Len(ccampollave) = 0 OR ISNUMERIC(ccampollave)=0) 

----Una vez fijado si campo llave viene o no vacio, tomamos unicamente los campos que tengan campo llave
 ----y con esta condicion fijamos tambien las siguientes banderas
 ----Tenemos ahora la bandera de campo llave repetido
 ----Tomamos aquellos campos llave que se encuentran repetidos y actualizamos bandera
  UPDATE tmpprecargaarchivo
  SET cbanderarepetido = 'S' 
WHERE cestatus IS NULL
  AND nid_base = @nId_Base
AND cColumnaValidacion='S'
  AND nid_archivobase = @nId_Archivo
  AND cbanderacampollave IS NULL
  AND ccampollave IN
    (SELECT ccampollave
     FROM tmpprecargaarchivo
     WHERE cestatus IS NULL
       AND nid_base = @nId_Base
       AND cbanderacampollave IS NULL
     GROUP BY ccampollave HAVING COUNT(*) > 1) 


----Habilitamos las banderas de falta de datos si faltan los datos de nombre, o apellidos
----Bandera para campo de nombre
  UPDATE tmpprecargaarchivo
  SET cbanderanombre1 = 'S' 
WHERE cestatus IS NULL
 AND nid_base = @nId_Base
AND cColumnaValidacion='S'
  AND nid_archivobase = @nId_Archivo
  AND cbanderacampollave IS NULL
  AND ccampollave IN
    (SELECT ccampollave
     FROM tmpprecargaarchivo
     WHERE cestatus IS NULL
       AND nid_base = @nId_Base
       AND (cnombre1 IS NULL
            OR Ltrim(Rtrim(cnombre1)) = ''
            OR Len(cnombre1) = 0)) 

-----Bandera para campo de apellido paterno
  UPDATE tmpprecargaarchivo
  SET cbanderaappaterno = 'S' WHERE cestatus IS NULL
  AND nid_base = @nId_Base
AND cColumnaValidacion='S'
  AND nid_archivobase = @nId_Archivo
  AND cbanderacampollave IS NULL
  AND ccampollave IN
    (SELECT ccampollave
     FROM tmpprecargaarchivo
     WHERE cestatus IS NULL
       AND nid_base = @nId_Base
       AND (cappaterno IS NULL
            OR Ltrim(Rtrim(cappaterno)) = ''
            OR Len(cappaterno) = 0)) 

----Bandera para campo de apellido materno
  UPDATE tmpprecargaarchivo
  SET cbanderaapmaterno = 'S' WHERE cestatus IS NULL
  AND nid_base = @nId_Base
AND cColumnaValidacion='S'
  AND nid_archivobase = @nId_Archivo
  AND cbanderacampollave IS NULL
  AND ccampollave IN
    (SELECT ccampollave
     FROM tmpprecargaarchivo
     WHERE cestatus IS NULL
       AND nid_base = @nId_Base
       AND (capmaterno IS NULL
            OR Ltrim(Rtrim(capmaterno)) = ''
            OR Len(capmaterno) = 0)) 

----Habilitamos tambien la bandera de telefono si no cumple con los requisitos
---a)Sin Telefono
  UPDATE tmpprecargaarchivo
  SET cbanderatelefono = 'S' WHERE cestatus IS NULL
  AND nid_base = @nId_Base
AND cColumnaValidacion='S'
  AND nid_archivobase = @nId_Archivo
  AND cbanderacampollave IS NULL
  AND (ctelefono1 IS NULL
       OR Isnumeric(ctelefono1) <>1
       OR Len(ctelefono1) = 0
       OR Ltrim(Rtrim(ctelefono1)) = '') 


----b)Longitud Telefono
  UPDATE tmpprecargaarchivo
  SET cbanderatelefonolongitud = 'S' WHERE cestatus IS NULL
  AND nid_base = @nId_Base
AND cColumnaValidacion='S'
  AND nid_archivobase = @nId_Archivo
  AND cbanderacampollave IS NULL
  AND (ctelefono1 IS NOT NULL
       AND  Len(ctelefono1) < 10) 

----Error Telefono
  UPDATE tmpprecargaarchivo
  SET cbanderaerrortelefono = 'S' WHERE cestatus IS NULL
  AND nid_base = @nId_Base
AND cColumnaValidacion='S'
  AND nid_archivobase = @nId_Archivo
  AND cbanderacampollave IS NULL
  AND (ctelefono1 IS NOT NULL
       AND  IsNumeric(ctelefono1) <>1)