output 子句 可以update、insert、delete、 merge into中
output子句可以代替部份触发器的功能,也可以立即返回结果
output into 是插入到表中
output 直接返回一个结果集
贴一个微软官方连接
https://docs.microsoft.com/zh-cn/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver15
<OUTPUT_CLAUSE> ::=
{
[ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ]
[ OUTPUT <dml_select_list> ]
}
<dml_select_list> ::=
{ <column_name> | scalar_expression } [ [AS] column_alias_identifier ]
[ ,…n ]
<column_name> ::=
{ DELETED | INSERTED | from_table_name } . { * | column_name }
| $action
可以看到,可以同时有两个output子句,但必须是output into 在前面,调整了顺序都不行。
insert 只能引用 inserted 新插入的值
delete 只能引用deleted 删除的值
update 则两个都可以 inserted 代表修改后的值 deleted 代表修改前的值
来一个例子 插入多行的时候,取得多行的自增值
declare @a table(id int identity(1,1),id2 int)
declare @b table(id int)
insert into @a(id2)
output inserted.id into @b -- 此处两个output的顺序必须这样 不能更改
output inserted.id
values(100),(300)
select * from @b
我在实际业务中,output最大的用处是 可以在insert语句中,直接就返回自增列的值。如果有多个也可以一并返回。比 @@identity和SCOPE_IDENTITY 更好用
很遗憾。mysql 只能使用 LAST_INSERT_ID(); LAST_INSERT_ID() 作用与 SQL Server的 SCOPE_IDENTITY 作用域一样: 返回为当前会话和当前作用域中的任何表的自增值
但不同的是 当一个insert语句有多条同时插入时
SCOPE_IDENTITY 返回的是 最后一条,而 LAST_INSERT_ID() 是返回第一条
举一个例子来说明作用域和多条返回第一条这两个规则。
CREATE TABLE test_5(
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name VARCHAR(10) NOT NULL
);
CREATE TABLE test_6(
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name VARCHAR(10) NOT NULL
);
插一些初始数据,让两个表数据不一样
现在两个表的结果是这样的
test_5 表

test_6表

test_5 表现在自增到5 而 test_6表自增到3
对test_5表,再创建一个触发器
delimiter //
create trigger insert_t5 after insert on test_5 for each row
begin
insert into test_6(name) select new.name;
end
//
delimiter ;
执行如下语句
insert into test_5(name) values('CCCCC'),('GGGGGG');
来看看现在两表的数据

test_5表 新增加的自增id为6,7

test_5表 新增加的自增id为4,5
再查询
select LAST_INSERT_ID();
6
得到是test_5表的本次插入第一行的自增id
不是本次插入最后一行的自增id
也不是因为test_5 引发触发器 test_6表的自增id.




