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]
GO CREATE 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,'' )

这样就可以在插入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.Col2
WHERE ID = 1

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

3、deleted

DELETE FROM dbo.AAA1
OUTPUT Deleted.ID,Deleted.Col2
WHERE 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 函数。

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

说一下output子句的更多相关文章

  1. OutPut子句的使用限制

    Output子句很方便,多数情况下可以省略了更新后插入或者删除后插入操作表,将2个语句变成1个语句操作.不管从语句美观还是效率上都是有不错的提升, 但是对于Output自身,也是有一些限制的. 从文档 ...

  2. OUTPUT 子句

    除了修改数据以外,一般不会希望修改语句后再做其他事情.也就是说,一般不会希望修改语句能够返回任何输出.然而,在有些场合下,能够从修改过的行中返回数据,这个功能可能也有一定的用处. 例如,考虑UPDAT ...

  3. 【SQL Server学习笔记】Delete 语句、Output 子句、Merge语句

    原文:[SQL Server学习笔记]Delete 语句.Output 子句.Merge语句 DELETE语句 --建表 select * into distribution from sys.obj ...

  4. sqlserver 插入 更新 删除 语句中的 output子句

    官方文档镇楼: https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/ms177564(v=sql.100) 从 ...

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

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

  6. SQL Server output子句用法 output inserted.id 获取刚插入数据的id

    --插入数据,并返回刚刚插入的数据id INSERT INTO [soloreztest] ([name]) output inserted.id VALUES ('solorez') --执行结果: ...

  7. SQL Server output经典使用

    output经典使用 分类: sql2012-02-16 18:17 409人阅读 评论(0) 收藏 举报 outputinserttabledeletegonull OUTPUT是SQL SERVE ...

  8. OUTPUT、Merge语句的使用

    新版本的数据库中增加了OUTPUT子句,这个很好用,详细的使用方式大家可以参考SQL的联机帮助文档.这里仅记录下常用的场景:在对数据库进行增删改的时候我们有时候需要记录日志(这里指将日志记录在DB中而 ...

  9. 带有OUTPUT的INSERT,DELETE,UPDATE

    原文地址:http://blog.sina.com.cn/s/blog_71460d950100nld2.html OUTPUT是SQL SERVER2005的新特性.可以从数据修改语句中返回输出.可 ...

随机推荐

  1. nginx平台初探(100%)

    http://tengine.taobao.org/book/chapter_02.html 初探nginx架构(100%)¶ 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的.那么 ...

  2. luogg_java学习_02_基本语法

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 关键字 定义:被java语言赋予了特殊含义,用作专门用 ...

  3. 泛函编程(36)-泛函Stream IO:IO数据源-IO Source & Sink

    上期我们讨论了IO处理过程:Process[I,O].我们说Process就像电视信号盒子一样有输入端和输出端两头.Process之间可以用一个Process的输出端与另一个Process的输入端连接 ...

  4. contentResolver

    今天练习一个联系人的增,写,改,查的几项操作,其中一个重要的知识点  ContentResolver 还有一篇不错的参考文献 主要参见下面这个链接  http://cthhqu.blog.51cto. ...

  5. MAC使用CocoaPods

    前言,還是那句話,按照濤叔下面畫黃色的步驟順序執行就好了 使用CocoaPods兩種方式:使用之前安裝的插件&命令行. 一.利用插件 1.創建項目后添加CocoaPods 2.在文本框中輸入如 ...

  6. 【FFmpeg】Windows下64位ffmpeg编译

    本文主要记录在64位Windows 7下,编译64位ffmpeg的过程. 1.资源准备 (1). MSYS http://sourceforge.net/projects/mingwbuilds/fi ...

  7. Django 模版语言详解

    一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. 例: {% extends "b ...

  8. Hadoop学习笔记1-如何简单布署hadoop

    企业机型配置: 选型标准:普通的,廉价的,标准的(容易替换的),工业化大规模生产的 CPU:支持多核CPU,如2个4核CPU 内存:16G以上,内存越大,常用数据都缓存在内存,提高速度 硬盘:不需RA ...

  9. Exif.js 读取图像的元数据

    Exif.js 提供了 JavaScript 读取图像的原始数据的功能扩展,例如:拍照方向.相机设备型号.拍摄时间.ISO 感光度.GPS 地理位置等数据. 注意事项: EXIF 数据主要来自拍摄的照 ...

  10. JS Nice – JavaScript 代码美化和格式化工具

    JS Nice 是一款让经过混淆处理的 JavaScript 代码可读更好的工具.它使用一种新型的用于 JavaScript 代码美化的去混淆和去压缩引擎.JSNice 采用先进的机器学习和程序分析技 ...