Augusto Humire Martinez web blog

algo de web-in

Filas actualizadas o afectadas en un Update Sql Server

Para recordar, como saber que filas se actualizaron en un update masivo, normalmente conocemos cuantos fueron afectados pero como identificar cuales fueron los registros actualizados?… cuales exactamente se actualizaron?, para ello utilizamos output (salida de los actualizados) y into (destino de los actualizados) dentro de un update

CREATE TABLE #tablaResultado
(
[Empresa] [varchar](50) NULL,
[Anio] [varchar](50) NULL,
[numeroDocumento] [varchar](50) NULL,
[Estado] [BIT] DEFAULT  0
)

UPDATE DB..Facturas
SET CodigoElectronico = CC.CodigoElectronico
,NombreEstado = CC.NombreEstado
,Mensaje = CC.Mensaje
OUTPUT ‘EMP’, CC.Anio, CC.numeroDocumento, 1
INTO #tablaResultado
FROM DB..Facturas FA WHERE FA.id IN (’11’,’12’,’13’,’14’)

OUTPUT Define los campos de los registros actualizados
INTO Define el destino donde se registrara los campos afectados

Como vemos el update que se esta ejecutando es uno masivo, y con esto ya sabemos que registros fueron los que se actualizaron para seguramente hacer algo con ellos despues.

El siguiente es otro ejemplo mas complejo, puesto que la idea es saber que registros fueron modificados segun una lista enviada. Explicando mas claramente… Si tuviera 1000 registros para actualizar, cuales de los mil se actualizaron, para ellos utilizaremos un campo estado que define cuales se actualizaron y cuales no.

CREATE TYPE [dbo].[Comprobante] AS TABLE(
[Empresa] [varchar](3) NULL,
[Anio] [varchar](4) NULL,
[numeroDocumento] [varchar](10) NULL,
[CodigoElectronico] [varchar](3) NULL,
[NombreEstado] [varchar](255) NULL,
[Mensaje] [varchar](255) NULL
[Estado] [BIT] = 0
)

CREATE PROCEDURE [usp_Actualiza_Estado_Comprobantes]
@comprobantesList as [Comprobante] READONLY
AS

CREATE TABLE #tablaResultado
(
[Empresa] [varchar](50) NULL,
[Anio] [varchar](50) NULL,
[numeroDocumento] [varchar](50) NULL,
[Estado] [BIT] DEFAULT  0
)

UPDATE DB..Facturas
SET CodigoElectronico = CC.CodigoElectronico
,NombreEstado = CC.NombreEstado
,Mensaje = CC.Mensaje
OUTPUT ‘301’, CC.Anio, CC.numeroDocumento, 1
INTO #tablaResultado
FROM DB..Facturas FA
INNER JOIN @comprobantesList CC ON (CC.numeroDocumento = FA.Documento AND CC.Anio = FA.Anio)

INSERT INTO #tablaResultado
SELECT Empresa, Anio, numeroDocumento, 0
FROM
(
SELECT Empresa, Anio, numeroDocumento
FROM @comprobantesList CC
EXCEPT
SELECT Empresa, Anio, numeroDocumento
FROM #tablaResultado TR
) tablaNoActualizados

SELECT * FROM #tablaResultado

DROP TABLE #tablaResultado

GO

DECLARE @comprobantesList as dbo.[Comprobante]
INSERT INTO @comprobantesList VALUES(‘301′,’2015′,’1300002790′,’0′,’bla bla’,’bla bla’)
INSERT INTO @comprobantesList VALUES(‘301′,’2015′,’1377002790′,’0′,’bla bla’,’bla bla’)
INSERT INTO @comprobantesList VALUES(‘301′,’2015′,’1377002890′,’0′,’bla bla’,’bla bla’)
exec [usp_Actualiza_Estado_Comprobantes] @comprobantesList

go

junio 5, 2015 Posted by | Base de Datos | 2 comentarios