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 »

  1. Excelente amigo, lo probaré

    Comentario por erickorlando | junio 5, 2015

  2. Ese codigo apesta..

    Comentario por Stephen | abril 19, 2017


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: