说一下output子句

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,‘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.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 函数。

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

时间: 2024-10-10 18:05:44

说一下output子句的相关文章

OutPut子句的使用限制

Output子句很方便,多数情况下可以省略了更新后插入或者删除后插入操作表,将2个语句变成1个语句操作.不管从语句美观还是效率上都是有不错的提升, 但是对于Output自身,也是有一些限制的. 从文档上看.主要有以下三点需要注意 1 Output into 的对象不能含有触发器 2 Output into 的对象不能是有外键的任何一方 3 Output into 的对象不可以带有Check约束或者启用的规则 带有这3种条件的对象(不管是表,还是临时表,还是表变量)都不能成为Output Into

output子句用法 output inserted.autoId

我遇到的问题: sql语句:insert into dbo.TblPerson(uName,age,height,gender) values (@uName,@age,@height,@gender) 同时用ExecuteScalar返回首行首列,总是显示“未将对象引用设置到对象的实例.”结果看代码案例才知道sql语句改为:insert into TblPerson output inserted.autoId values(@name,@age,@height,@gender)就可以了.ou

TSql Output 用法

第一部分:TSql Output 关键字有两种应用场景 1,作为存储过程的参数类型,从存储过程中返回数据 2,返回受 INSERT.UPDATE.DELETE 或 MERGE 语句影响的各行中的信息,可以捕获嵌入到 INSERT.UPDATE.DELETE 或 MERGE 语句中 OUTPUT 子句的结果,然后将这些结果插入目标表. 3,语法 <OUTPUT_CLAUSE> ::= { [ OUTPUT <dml_select_list> INTO { @table_variabl

(转载)output经典使用

OUTPUT是SQL SERVER2005的新特性.可以从数据修改语句中返回输出.可以看作是"返回结果的DML".INSERT,DELETE,UPDATE均支持 OUTPUT子句.在OUTPUT子句中,可以引用特殊表inserted和deleted.使用inserted和deleted表与在触发器中使用的非常相似. 在INSERT,DELETE,UPDATE中OUTPUT的区别 1.对于INSERT,可以引用inserted表以查询新行的属性. 2.对于DELETE,可以引用delet

基本的查询流【MSSQL】

4个DML(Data Manipulation Language)命令(SELECT INSERT UPDATE DELETE) 查询语法有一个特有的固定顺序 SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY 3.FROM子句数据源 本地SQL Server表.(单个SQL SELECT语句中可访问的表的数量不能超过256个) 子查询作为派生表,也称为子选择或内联视图. 视图或存储的SELECT语句. 表值用户定义的函数返回行和列. 分布式

SQL增强之Merge

SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MSDN:http://msdn.microsoft.com/zh-cn/library/bb510625.aspx 功能:根据与源表联接的结果,对目标表执行插入.更新或删除操作.例如,根据在另一个表中找到的差异在一个表中插入.更新或删除行,可以对两个表进行同步. 我们看一个例子,假如,有一总产品列表,一个分店产品列表,需要从分店添加产品时更新总产品列表. 总产品表,分店产品表结构完全一致: 复制代码代码如下: if O

9、SQL Server 操作数据

插入数据 使用Insert Into 插入 if(exists(select * from sys.databases where name = 'webDB')) drop database webDB go --创建数据库 create database webDB on primary ( name = 'webDB', filename='d:\webDB.mdf', size = 5mb, maxsize=unlimited, filegrowth=10% ) log on ( nam

SQLServer 2008中SQL增强之三 Merge(在一条语句中使用

SQLServer 2008中SQL增强之三 Merge(在一条语句中使用Insert,Update,Delete) SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MSDN:http://msdn.microsoft.com/zh-cn/library/bb510625.aspx 功能:根据与源表联接的结果,对目标表执行插入.更新或删除操作.例如,根据在另一个表中找到的差异在一个表中插入.更新或删除行,可以对两个表进行同步. 我们看一个例子,假如,有一总产品列表,一

SQLServer : EXEC和sp_executesql的区别

MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql.通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能(对于这个我在后面的例子中会详加说明),还可以编写更安全的代码.EXEC在某些情况下会更灵活.除非您有令人信服的理由使用EXEC,否则尽量使用 sp_executesql. EXEC的使用 EXEC命令有两种用法,一种是执行一