Output子句日常灰常有用,而且用的地方也挺多,但是确好多时候被我们忽视,今天我就也简单扫盲一下这个语句的用法。

Output子句

返回受 INSERT、UPDATE、DELETE 或 MERGE 语句影响的各行中的信息,或返回基于受这些语句影响的各行的表达式。 这些结果可以返回到处理应用程序,以供在确认消息、存档以及其他类似的应用程序要求中使用。 也可以将这些结果插入表或表变量。 另外,您可以捕获嵌入的 INSERT、UPDATE、DELETE 或 MERGE 语句中 OUTPUT 子句的结果,然后将这些结果插入目标表或视图(视图并不能直接插入的,等下我说)。

下面做下这4种类型的output 用法

先搞个测试表

CREATE TABLE [dbo].[AAA1]
(
[ID] [int] PRIMARY KEY,
[Col2] VARCHAR(100)
) ON [PRIMARY]
GOCREATE TABLE [dbo].[AAA2]
(
[ID] [int] PRIMARY KEY,
[Col2] VARCHAR(100)
) ON [PRIMARY]
GO

1、 insert

INSERT INTO dbo.AAA1( ID, Col2 )
OUTPUT Inserted.ID,Inserted.Col2 INTO AAA2(ID,Col2)
VALUES  ( 4,'1' )

这样就可以在插入AAA1 的同时将插入的结果输出插入到 AAA2 里面。

我想到有2个常用的场景

1、有些功能想要写入记录的时候也同时插入一个记录表来记录操作,很多时候会想起触发器。如果只是如此单纯的操作,那么真还不如使用一句output来得实惠了。但是这个也看具体场景,不扯太远。

2、当我们单条插入的时候,要捕获ID的话还可以使用  SCOPE_IDENTITY() 来获取,但是如果批量的时候,要获取插入的自增列对应的列,就可以使用OutPut 来捕获了~

2、update

UPDATE AAA1 SET col2 = 'BB'OUTPUT Deleted.ID,Deleted.Col2,Inserted.ID,Inserted.Col2WHERE ID = 1

在update 里面呢,就会存在有 Deleted 和 inserted 2个临时表,这个就类似于 触发器里面的 deleted表和 inserted 表了。可以捕捉到更新前后的值

3、deleted

DELETE FROM dbo.AAA1OUTPUT Deleted.ID,Deleted.Col2WHERE ID = 1

delete 也就是差不多,语法是一样的。

4、 Merge

MERGE dbo.AAA1 AS TAR
USING (SELECT 1,'a'
) AS SOUR(ID,Col2)
ON 1 = 0
WHEN NOT MATCHED THEN INSERT (ID,Col2) VALUES (SOUR.ID,SOUR.Col2)
OUTPUT $action,Deleted.*,Inserted.*;

Merge就有一个独特一点的 $Action 的东东,这个的值会表示它的行动,有 'INSERT','UPDATE','DELETE' 3种动作。对于要捕捉在Merge里面的变化就很好用啦~

Merge还有一点比较好用,可以把没有插入到目标的列,也带到Output里面来~这个就可以清晰的看到每一行数据的对应情况了

但是Output虽好,但是还是会有一些限制,有些我遇到过,有些还没测试过。(以下内容出自联机文档)

  • 整个操作是原子的。 INSERT 语句和包含 OUTPUT 子句的嵌套 DML 语句要么都执行,要么整个语句都失败。

  • 以下限制适用于外层 INSERT 语句的目标:

    • 目标不能为远程表、视图或公用表表达式。 (这个好理解,这个是指insert 的对象,并非指 output into 的对象)

    • 目标不能有 FOREIGN KEY 约束,或者被 FOREIGN KEY 约束所引用。 (就是output into 的目标表不能带外键)

    • 不能对目标定义触发器。

    • 目标不能参与合并复制或事务复制的可更新订阅。

  • 对于嵌套的 DML 语句有以下限制:

    • 目标不能为远程表或分区视图。

    • 源本身不能包含 <dml_table_source> 子句。

  • 在包含 <dml_table_source> 子句的 INSERT 语句中不支持 OUTPUT INTO 子句。

  • @@ROWCOUNT 返回仅由外层 INSERT 语句插入的行。

  • @@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 仅返回由嵌套的 DML 语句生成的标识值,而不返回由外层 INSERT 语句生成的标识值。

  • 查询通知将语句作为单个实体进行处理,并且即使重大更改是来自外层 INSERT 语句本身,所创建的任何消息的类型也将是嵌套 DML 的类型。

  • 在 <dml_table_source> 子句中,SELECT 和 WHERE 子句不能包括子查询、聚合函数、排名函数、全文谓词、执行数据访问的用户定义函数或是 TEXTPTR 函数。

其它东西~遇到了在继续补充

转载于:https://www.cnblogs.com/Gin-23333/p/5169321.html

说一下output子句相关推荐

  1. SQL output子句的用法

    以上是表soloreztest的原始内容使用output子句对其进行操作 A. 将 OUTPUT INTO 用于简单 INSERT 语句 以下示例将行插入soloreztest表,并使用 OUTPUT ...

  2. 在output 子句和 scope_identity() 混合使用的时候的注意事项

    无意睹到一篇旧文档 SR0008:考虑使用 SCOPE_IDENTITY 代替 @@IDENTITY :https://msdn.microsoft.com/zh-cn/library/dd17212 ...

  3. sql limit 子句_SQL Server TOP子句概述和示例

    sql limit 子句 This article explores the SQL Server TOP clause using various examples, along the way, ...

  4. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视( ...

  5. 获得插入行身份的最佳方法?

    什么是获得最佳方式IDENTITY插排的? 我知道@@IDENTITY和IDENT_CURRENT和SCOPE_IDENTITY但不了解它们各自的优缺点. 有人可以解释这些差异以及何时使用它们吗? # ...

  6. SQL Server中的Merge关键字

    简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:&q ...

  7. SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)

    SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MS ...

  8. SQL Server温故系列(1):SQL 数据操作 CRUD 之增删改合

    1.插入语句 INSERT INTO 1.1.用 INSERT 插入单行数据 1.2.用 INSERT 插入多行数据 1.3.用 INSERT 插入子查询结果行 1.4.INSERT 小结及特殊字段插 ...

  9. 使用insert向表中添加数据MySQL_使用INSERT语句向表中插入数据(MSSQLSERVER版)

    做开发的同仁对于向数据库中插入数据可谓是太普通不过了,也没什么说的,一般都是采用常用的INSERT INTO [(字段列表)] VALUES(字段值列表),这样的方式进行操作.今天,我要给大家介绍的是 ...

最新文章

  1. 删除git中无用的大文件
  2. 16、计算机图形学——基于AABB进行光线追踪的加速(下)
  3. Android之PullToRefresh控件源码解析
  4. 【Linux】Linux 文件中^M字符处理
  5. C++ Primer 5th笔记(chap 13 拷贝控制)拷贝赋值函数
  6. Java简单输入输出
  7. shader 获取法线_Unity Shader 入门到改行5——法线贴图
  8. java中0x07_JAVA里0X00的表示
  9. 买到同类票的概率(洛谷P2719题题解,Java语言描述)
  10. Ubuntu中安装和卸载apache2
  11. adafruit1306_Adafruit的2015年最佳开源可穿戴设备
  12. 解决li在ie,firefox中行高不一致问题
  13. matlab空域图像增强,图像处理的MATLAB实现实验一 空域图像增强.doc
  14. 影视剪辑,视频剪辑的万能剪辑技巧来啦,剪辑技巧合集
  15. Glide用法总结--缓存与下载方法
  16. 如何在word中输入带方框的对钩
  17. 【微信小程序】获取用户手机号的实现
  18. java(File、IO流)
  19. 江苏省一级计算机ms,计算机一级六大MS题型介绍
  20. 【LeetCode】解题309:Best Time to Buy and Sell Stock with Cooldown(动态规划)

热门文章

  1. [程序设计语言] 堆和栈的全面总结
  2. 基于对象的JavaScript编程
  3. 昨天添加的clustrMaps,忘了截屏,今天补上,就作为我在园子里的奠基。
  4. 评估一个垃圾收集(GC)
  5. net程序员的iPhone开发-MonoTouch
  6. 发送邮件 的类 C# .net
  7. axios异步请求数据的简单使用
  8. 您好,这是我的第一篇文章
  9. mybatis处理集合、循环、数组和in等语句的使用
  10. ReactJS学习 相关网站