Hoy miré la cláusula de salida en SQL Server 2005 para que pueda devolver datos a las variables de la tabla desde declaraciones de modificación (INSERT, UPDATE, DELETE). Los escenarios útiles para DML con resultados incluyen la depuración y el archivado, aplicaciones de mensajería y otros escenarios. La sintaxis de esta nueva cláusula OUTPUT es:
OUTPUT <dml_select_list> INTO @table_variable
puede acceder a la imagen antigua/nueva de la fila modificada haciendo referencia a la tabla insertada y a la tabla eliminada, de forma similar a acceder a los activadores. En una declaración INSERT, solo se puede acceder a la tabla insertada. En una declaración DELETE, solo se puede acceder a las tablas eliminadas. En la declaración ACTUALIZAR, puede acceder a tablas insertadas y tablas eliminadas. El siguiente es un ejemplo de MSDN:
como ejemplo de un esquema de depuración y archivado que puede ser útil para DML con resultados, suponga que tiene una tabla de pedidos grande y desea depurar datos históricos de forma regular. También desea copiar los datos eliminados a una tabla de archivo denominada OrdersArchive. Declaras una variable de tabla llamada @DeletedOrders e ingresas un bucle en el que eliminas datos históricos en fragmentos (por ejemplo, pedidos anteriores a 2003). El código agregado aquí es la cláusula OUTPUT, que copia todos los atributos de todas las filas eliminadas en la variable de la tabla @DeletedOrders y luego usa la instrucción INSERT INTO para copiar todas las filas de la variable de la tabla en la tabla OrdersArchive:
DECLARE @DeletedOrders TABLE
(
ID de pedido INT,
fecha del pedido FECHA HORA,
empidINT,
custida VARCHAR(5),
cantidadINT
)
MIENTRAS 1=1
COMENZAR
COMENZAR TRAN
ELIMINAR TOP(5000) DE Órdenes
SALIDA eliminada.* EN @DeletedOrders
DONDE fecha de pedido < '20030101'
INSERTAR EN Archivo de pedidos
SELECCIONAR * DE @DeletedOrders
COMPROMETER TRAN
ELIMINAR DE @DeletedOrders
SI @@rowcount < 5000
ROMPER
FINAL
Otro ejemplo es el siguiente si hay una tabla como la siguiente: Crear tabla Empleado (EmpID int identidad (1, 1) restricción Empleado_pk clave principal, Nombre varchar (100), Apellido Varchar (100), Sexo char (1), Saludo como caso cuando Sexo ='M' luego 'Sr.' cuando Sexo ='F' luego 'Sra.' fin, Salario Dinero, Deducciones como caso Cuando Salario <3000 entonces .20 * Salario cuando Salario entre 30000 y 50000 luego .26* Salario cuando Salario entre 50001 y 75000 entonces .30*Salariode lo contrario .35*Fin del salario, restricción de fecha y hora del DOJ DOJ_DEF getdate() predeterminado)
} Una tabla muy simple, en cuyo caso las cláusulas se utilizan para establecer Saludos, deducciones, doj, etc. respectivamente. Y podemos crear otro procedimiento almacenado, de la siguiente manera: Crear procedimiento empleado_insertar@Fname varchar(100),@Lname varchar(100),@sex char(1),@Salary Moneyasdeclare @empoutput table (EmpID int, FirstName varchar(100) , Apellido Varchar(100), Sexo char(1), Saludo char(3), Salario, Deducciones, DOJ fecha y hora) insertar en Empleado (Nombre, Apellido, Salario, sexo) SALIDA insertada.* en @empoutputvalues(@Fname) ,@Lname ,@Salary,@sex )Seleccione * de @empoutput
Luego, al llamar al procedimiento almacenado, puede usar USE [MyDatabase] de esta manera
GOexec Employee_insert 'Miho','Yoshikawa','F',146000
De esta manera, los datos se insertarán en la tabla de empleados durante la ejecución y se definirá una variable temporal empoutput. Tenga en cuenta que esto puede tener la forma de una tabla. Definido en el formulario, es fácil de ver aquí, y los datos insertados en la tabla de empleados se enviarán a la variable empoutput al mismo tiempo. Después de ejecutar este procedimiento almacenado, encontraremos los siguientes resultados.
EmpID, nombre, apellido, sexo, saludo, salario, deducciones, DOJ
7,Miho,Yoshikawa,F,Sra.,146000.00,51100.00,2006-04-09 23:16:44.920
, y los registros se insertan efectivamente en la tabla de empleados
Puedes ver
la fuente: jackyrong BLOG