SQL Server 中的output子句可以使你从修改语句(INSERTUPDATEDELETE)中将数据返回到表变量中带结果的 DML 的有用方案包括清除和存档消息处理应用程序以及其他方案这一新的 OUTPUT 子句的语法为
OUTPUT INTO @table_variable
可以通过引用插入的表和删除的表来访问被修改的行的旧/新映像其方式与访问触发器类似在 INSERT 语句中只能访问插入的表在 DELETE 语句中只能访问删除的表在 UPDATE 语句中可以访问插入的表和删除的表下面选用MSDN的例子介绍之
作为带结果的 DML 可能有用的清除和存档方案的示例假设你具有一个大型的 Orders 表并且希望定期清除历史数据你还希望将清除的数据复制到一个名为 OrdersArchive 的存档表中你声明了一个名为 @DeletedOrders 的表变量并且进入一个循环在该循环中你使用上文中的TOP 增强功能一节中描述的清除方法成块地删除了历史数据(比如早于 年的定单)这里增加的代码是 OUTPUT 子句它将所有被删除的行的所有属性复制到 @DeletedOrders 表变量中然后使用 INSERT INTO 语句将该表变量中的所有行复制到 OrdersArchive 表中
DECLARE @DeletedOrders TABLE
(
orderid INT
orderdate DATETIME
empid INT
custid VARCHAR()
qty INT
)
WHILE =
BEGIN
BEGIN TRAN
DELETE TOP() FROM Orders
OUTPUT deleted* INTO @DeletedOrders
WHERE orderdate <
INSERT INTO OrdersArchive
SELECT * FROM @DeletedOrders
COMMIT TRAN
DELETE FROM @DeletedOrders
IF @@rowcount <
BREAK
END
再举一个例子如下假如有表如下
Create table Employee(EmpID int identity( ) constraint Employee_pk primary key FirstName varchar() LastName Varchar() Sex char() Salutation as case when Sex =M then Mr when Sex =F then Ms else end Salary Money Deductions as case When Salary < then * Salarywhen Salary between and then *Salary when Salary between and then *Salaryelse *Salary end DOJ datetime constraint DOJ_DEF default getdate())
很容易的一个表其中用到了case子句分别对Salutation deductionsdoj等进行了设置而我们可以再搞一个存储过程如下
Create procedure employee_insert@Fname varchar()@Lname varchar()@sex char()@Salary Moneyasdeclare @empoutput table (EmpID int FirstName varchar() LastName Varchar()Sex char() Salutation char()Salary MoneyDeductions MoneyDOJ datetime )insert into Employee(FirstNameLastNameSalarysex)OUTPUT inserted* into @empoutputvalues(@Fname @Lname @Salary@sex )Select * from @empoutput
然后在调用该存储过程时可以这样来用USE [MyDatabase]
GOexec employee_insert MihoYoshikawaF
这样将在执行的时候将往employee表里插入数据并且将定义了一个临时的变量empoutput注意哦这个可以以表的形式定义的这里很容易看的出来并且将插入到employee表的数据同时输出到这个empoutput变量中去我们执行这个存储过程后会发现如下结果
EmpIDFirstNameLastNameSexSalutationSalaryDeductionsDOJ
MihoYoshikawaFMs ::
并且employee表中的确插入了记录
调用带有Output参数的存储过程txt
CREATE PROCEDURE SP_RealTimeDisplay
(
@FromEmp nvarchar()
@FromDep nvarchar()
@i nvarchar() output
@i nvarchar() output
@i nvarchar() output
)
AS
set nocount on
公司批复
select @i=(Select count(FsignID) as Sum From T_MessageSignature Where FSignID=@FromEmp and FLastSignID= and FSignRemark is null)
会签意见
select @i=(Select count(FsignID) as Sum From T_MessageSignature Where FSignID=@FromEmp and FLastSignID= and FSignRemark is null)
考勤审批
select @i=(Select count(FKaoQinID) as Sum From T_KaoQin Where FDepID Like @FromDep and FCheckerID=)
GO
调用先定义再输出
DECLARE @a nvarchar()
DECLARE @b nvarchar()
DECLARE @c nvarchar()
Execute SP_RealTimeDisplay %@a output@b output@c output
select @a as aa @b as bb@c as cc