mssql sqlserver output关键字返回值说明


摘要:
下文详细说明sqlserver中output关键字的返回信息。
实验环境:sqlserver 2008


output可输出insert、update、delete、merge关键字中影响的各行信息,我们可以通过output关键字,将程序的这些变量保存只日志表中,供后续的错误分析。

注意事项:
output输出时,如果insert update delete语句执行出错时,output也会输出相关信息至客户端-但是未获取相关的信息。
output输出信息反应在insert update delete语句之后,触发器操作之前的数据
当使用INSTEAD OF 触发器,即使没有因为触发器的操作而发生修改,也会如同实际执行 INSERT、UPDATE 或 DELETE 那样生成返回的结果。
如果在触发器的主体内使用包含 OUTPUT 子句的语句,则必须使用表别名来引用触发器 inserted 和 deleted 表

——————————–output语法规则——————————–
ouput <表达式A> into {‘表变量’|’临时表’|’物理表’} [{插入列名B}]
插入列名B:须同表达式A所输出的列名信息一致,缺省时,“’表变量’|’临时表’|’物理表’” 这些表的列名须同输出列名一致
表达式A: <表达式C> | 计算列 } [ [AS] 列别名 ]
计算列: 可取计算结果为单个值的任何符号和运算符的组合。计算列中不允许使用聚合函数。
计算列中对修改表的引用须使用inserted 和deleted前缀作为限定
表达式C:{ DELETED | INSERTED | from_table_name } . { * | 列名 }
| $action
$action:此关键字只可用于merge子句, 功能为获取 merge关键字的操作方式 “insert update delete”

DELETED:获取目标表更新或删除前的值-同触发器中的delted功能一致
INSERTED::获取目标表插入值-同触发器中的delted功能一致
——————————————————————————
例:

CREATE TABLE test(keyId int ,info varchar(30) )  
GO

----insert 子句,output执行正常
insert into test(keyId,info)
output inserted.keyId  as [正常输出]
values(12,'maomao365.com')
go

---insert 子句,output 执行出错
insert into test(keyId,info)
output convert(varchar(20),inserted.keyId)  as [异常输出]
values('a','猫猫小屋')
go

select * from test 

go
drop table test 
 

1.mssql_output子句获取插入前的数据

1.mssql_output子句获取插入前的数据


例:输出更新、删除信息

  
CREATE TABLE test(keyId int ,info varchar(30) )  
GO
----insert 子句,output执行正常
insert into test(keyId,info) 
output inserted.keyId,inserted.info
values(12,'maomao365.com'),
(88,'猫猫小屋')
go
 
 ---update子句,output输出
 update test set info='a'
 output inserted.keyId,inserted.info,
 deleted.keyId,deleted.info 
 where keyId =12
go
 ---delete子句,output输出
  delete  test  
 output  deleted.keyId,deleted.info 
 go
 
drop table test 
2.mssql_output子句获取更新删除前的数据

2.mssql_output子句获取更新删除前的数据