暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Server output子句的使用--这么好用的功能mysql 没有。

原创 aisql 2022-12-21
759

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 表
image.png

test_6表
image.png

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');

来看看现在两表的数据

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

image.png

test_5表 新增加的自增id为4,5

再查询

select LAST_INSERT_ID();

6

得到是test_5表的本次插入第一行的自增id
不是本次插入最后一行的自增id

也不是因为test_5 引发触发器 test_6表的自增id.

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论