viernes, 21 de septiembre de 2012

UPDATE con INNER JOIN (SELECT)

Bueno antiguamente recurría, a usar un cursor para actualizar campos de una tabla, bueno por lógica 

Paso1: cargaba los datos de una tabla en un cursor
paso2: empezaba a recorrer el cursor
paso3: cada recorrido de un registro actualizaba datos de otra tabla, (obviamente en los datos que tenian en igualdad)

ERRRORRRR, indudablemente funciona, o si FUNCIONAAA, pero, viene el pero, sucede que si lo mando a realizar este proceso sobre una tabla de 20,000 demorar unos cuantos segundos, si lo mando a 500,000 ya se demora unos minutos y si sobre pasa de millon, imagínense que demora, por lo tanto los cursores no los vuelvo a tocar.

Solución no favorable (usando cursor)
DECLARE @XCODIGO CHAR(10), @XSERIE CHAR(4)
declare MIPAPELETA CURSOR FOR SELECT cCodigo,cserie FROM TU_PAPELETA
OPEN MIPAPELETA
FETCH NEXT FROM MIPAPELETA INTO @XCODIGO,@XSERIE
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE TU_CTA_CORRIENTE SET ccodigo=@XCODIGO   WHERE SERIE=@XSERIE
FETCH NEXT FROM MIPAPELETA INTO @XCODIGO,@XSERIE
END
CLOSE MIPAPELETA
DEALLOCATE MIPAPELETA
GO



SQL SERVER 2008
Solución optima (sin cursor)

UPDATE TU_INSPECTORES 
SET TU_INSPECTORES.cCodigoPersona = TG_PERSONA.cCodigoPersona
FROM TU_INSPECTORES INNER JOIN TG_PERSONA 
ON TU_INSPECTORES.cdniinspector = TG_PERSONA.cNumeroTD
WHERE tg_persona.cCodigoTD='02'


Muy aparte que uff no ahorramos lineas de codigo.

UPDATE
    Table
SET
    Table.col1 = other_table.col1,
    Table.col2 = other_table.col2FROM
    Table
INNER JOIN
    other_tableON
    Table.id = other_table.id




Pueden observar en el siguiente link también su funcionalidad

Hasta la próxima, nos vemos

miércoles, 12 de septiembre de 2012

Insertando un Registro y Actualizando SI EXISTE EXISTS SQL SERVER

Bueno hoy algo sencillo pero que tambien podría ser útil para algún lector, como hacemos para verificar si el registro existe en la tabla, para actualizar o bien insertar como nuevo registro

Solución 1:
Si al hacer la consulta devuelve algún registro el EXIST devolvera TRUE

IF NOT EXISTS(SELECT ID FROM EMPLEADO WHERE ID = @ID)
   INSERT INTO EMPLEADO (Nombre,Apellido, ID) VALUES (@_nombre,@_apellido ,@ID)
ELSE   UPDATE EMPLEADO SET Nombre=@_nombre, Apellido=@_apellido WHERE ID = @ID

Nota: Talvez en procedimiento esta solución, es la mas común, pero esta haciendo un select, por lo tnato acarrea recursos o un par de milisegundos.

Solución 2:
Ahora utilizaremos una función del sistema para poder realizar lo mismo. @@ROWCOUNT

UPDATE TABLA SET Campo1 = @Valor WHERE ID = @ID
IF @@ROWCOUNT = 0
   INSERT INTO TABLA (Campo1,ID) VALUES (@Valor,@ID)

Nota: Por defecto, mandamos la linea de actualización de registro, y con nuestra función verificamos si alguna fila o registro a sido afectado, caso que no haya afectado, insertamos el nuevo registro.

Aca un ejemplo usando @@ROWCOUNT y raiserror


UPDATE TOP(1) TU_CTA_CORRIENTE SET cIdAnt=cId, cId='D', dtfechaanulacion=GETDATE(), cUsuarioSis=@_usuario, cEquipoSis=@_equipo, cIPSis=@_ip, cMacNICSis=@_mac
WHERE ccodigoautogeneradopapeleta=@_papeleta
IF @@ROWCOUNT=0
    begin
      raiserror('No se ha actualizado ningun registro',16,1)
      return
    end


Otras soluciones podemos utilizar un BEGIN TRY , BEGIN CATCH, para la solucion 2 y tendriams otra lógica.

Hasta la próxima ...