SQL SERVER : (DELETE, TRANSACCIONES)



SCRIPT CARGA DE REGISTROS


CREATE TABLE DATOS(
Id INT IDENTITY not null,
dato VARCHAR(100),
fx_alta DATETIME,
CONSTRAINT PK_DATOS PRIMARY KEY(Id)
);

DECLARE
@i INT,
@dato VARCHAR(100)
SET @i = 0

WHILE (@i < 100)
BEGIN
     SET @i = @i + 1
     SET @dato = 'Dato : ' + CAST(@i AS VARCHAR)
     INSERT INTO DATOS (dato,fx_alta)
     VALUES (@dato,GETDATE())
END;

SELECT * FROM DATOS;

Devuelve el número de filas afectadas por la última declaración. Si el número de filas es de más de 2 mil millones, utilizar ROWCOUNT_BIG .


Cuando borramos datos de una tabla, podemos obtener el número de filas que han sido afectadas por la instrucción a través de la variable @@RowCount.

DELETE FROM DATOS WHERE Id=3;
SELECT @@ROWCOUNT;



Clausula OUTPUT

    A partir de la version de SQL Server 2005 disponemos de la clausula OUTPUT para recuperar los valores que hemos insertado. Al igual que en un trigger disponemos de las tablas lógicas INSERTED y DELETED.
    Las columnas con prefijo DELETED reflejan el valor antes de que se complete la instrucción UPDATE o DELETE. Es decir, son una copia de los datos "antes" del cambio.
    DELETED no se puede utilizar con la cláusula OUTPUT en la instrucción INSERT.

DECLARE @Filas_Borradas TABLE
(
Id INT,
dato VARCHAR(100),
fx_alta DATETIME
)

DELETE
FROM DATOS
OUTPUT DELETED.* INTO @Filas_Borradas
WHERE Id = 17;

SELECT * FROM @Filas_Borradas;


transacciones explicitas.
DECLARE @importe DECIMAL(18,2),
@CuentaOrigen VARCHAR(12),
@CuentaDestino VARCHAR(12)
/* Asignamos el importe de la transferencia
* y las cuentas de origen y destino
*/
SET @importe = 50
SET @CuentaOrigen = '200700000002'
SET @CuentaDestino = '200700000001'
BEGIN TRANSACTION -- O solo BEGIN TRAN
BEGIN TRY

/* Descontamos el importe de la cuenta origen */

UPDATE CUENTAS
SET SALDO = SALDO - @importe
WHERE NUMCUENTA = @CuentaOrigen
/* Registramos el movimiento */

INSERT INTO MOVIMIENTOS
(IDCUENTA, SALDO_ANTERIOR, SALDO_POSTERIOR, IMPORTE, FXMOVIMIENTO)

SELECT
IDCUENTA, SALDO + @importe, SALDO, @importe, getdate()

FROM CUENTAS
WHERE NUMCUENTA = @CuentaOrigen
/* Incrementamos el importe de la cuenta destino */

UPDATE CUENTAS
SET SALDO = SALDO + @importe
WHERE NUMCUENTA = @CuentaDestino
/* Registramos el movimiento */

INSERT INTO MOVIMIENTOS
(IDCUENTA, SALDO_ANTERIOR, SALDO_POSTERIOR, IMPORTE, FXMOVIMIENTO)

SELECT
IDCUENTA, SALDO - @importe, SALDO, @importe, getdate()

FROM CUENTAS
WHERE NUMCUENTA = @CuentaDestino
/* Confirmamos la transaccion*/
COMMIT TRANSACTION -- O solo COMMIT
END TRY
BEGIN CATCH

/* Hay un error, deshacemos los cambios*/
ROLLBACK TRANSACTION -- O solo ROLLBACK

PRINT 'Se ha producido un error!'
END CATCH





REFERENCIA : 
http://www.devjoker.com/contenidos/Tutorial-de-Transact-SQL/292/Transacciones-en-Transact-SQL.aspx













Comentarios

Entradas populares de este blog

Para que sirve la N en SQL Server

MYSQL : CURSORES

SSIS- Package con origen de datos Excel dinámicos