--OUTPUT子句的基本原理是很简单的——它返回由每个INSERT、UPDATE或DELETE命令所影响的记录行。 --OUTPUT子句中可以引用INSERTED或DELETED虚拟表 --注意:不能在一个INSERT语句中引用DELETED,也不能在一个DELETED语句中引用INSERTED,因为这些虚拟表在这两种情况下逻辑上是没有意义的,所以SQL Server不会去创建。 use kdcc go if exists(select * from sys.tables where name = 'Employees' and type = 'U') drop table Employees go create table dbo.Employees ( EmployeeID INT NOT NULL IDENTITY(1, 1), FirstName VARCHAR(50) NOT NULL, LastName VARCHAR(50) NOT NULL, Status VARCHAR(20) DEFAULT 'Single' ) --插入一行数据并加上OUTPUT来返回执行插入操作时所插入到应用中的记录: INSERT INTO dbo.Employees(FirstName,LastName) OUTPUT INSERTED.* SELECT 'Susan', 'Kelley' go if exists(select * from sys.tables where name = 'Employees_Archive' and type = 'U') drop table Employees_Archive go create table dbo.Employees_Archive ( EmployeeID INT NOT NULL,-- IDENTITY(1,1), FirstName VARCHAR(50) NOT NULL, LastName VARCHAR(50) NOT NULL, [Status] VARCHAR(20) DEFAULT 'Single', ChangedBy VARCHAR(300) NOT NULL, ChangedDatetime DATETIME NOT NULL ) go --更新Susan的信息记录,同时使用OUTPUT子句和DELETED虚拟表将旧的记录行插入到Employee_Archive表中 UPDATE dbo.Employees SET LastName = 'Jones', Status = 'Married' OUTPUT DELETED.*, system_user, getdate() INTO dbo.Employees_Archive WHERE EmployeeID = 1 /* --归档数据 一般写法 WHILE 1 = 1 BEGIN BEGIN TRANSACTION INSERT INTO ArchiveTable SELECT * FROM MainTable WHERE ID BETWEEN @MinID AND @MaxID DELETE FROM MainTable WHERE ID BETWEEN @MinID AND @MaxID COMMIT TRANSACTION END --归档数据 使用output DELETE FROM MainTable OUTPUT DELETED.* INTO ArchiveTable WHERE ID BETWEEN @MinID AND @MaxID */