原文:sql server 带有OUTPUT的INSERT,DELETE,UPDATE

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

在INSERT,DELETE,UPDATE中OUTPUT的区别 

1.对于INSERT,可以引用inserted表以查询新行的属性.

2.对于DELETE,可以引用deleted表以查询旧行的属性.

3.对于UPDATE,使用deleted表查询被更新行在更改前的属性,用inserted表标识被更新行在更改后的值.  

输出方式: 

1.可以输出给调用方(客户端应用程序)

2.输出给表

3.两者皆可. 

应用:  

一.带有OUTPUT的INSERT的应用 

对于包含自增列的表执行多行insert语句,同时想知道新的标识值时,在INSERT中使用OUTPUT子句非常方便.对于单行INSERT语句,这不成问题:SCOPE_IDENTITY函数即可实现. 

  1. -- Generating Surrogate Keys for Customers  
  2. USE tempdb;  
  3. GO  
  4. IF OBJECT_ID('dbo.CustomersDim') IS NOT NULL  
  5.   DROP TABLE dbo.CustomersDim;  
  6. GO  
  7.   
  8. CREATE TABLE dbo.CustomersDim  
  9. (  
  10.   KeyCol      INT          NOT NULL IDENTITY PRIMARY KEY,  
  11.   CustomerID  NCHAR(5)     NOT NULL,  
  12.   CompanyName NVARCHAR(40) NOT NULL,  
  13.   /* ... other columns ... */  
  14. );  
  15.   
  16. -- Insert New Customers and Get their Surrogate Keys  
  17. DECLARE @NewCusts TABLE  
  18. (  
  19.   CustomerID NCHAR(5) NOT NULL PRIMARY KEY,  
  20.   KeyCol     INT      NOT NULL UNIQUE  
  21. );  
  22.   
  23. INSERT INTO dbo.CustomersDim(CustomerID, CompanyName)  
  24.     OUTPUT inserted.CustomerID, inserted.KeyCol  
  25.     INTO @NewCusts  
  26.     -- OUTPUT inserted.CustomerID, inserted.KeyCol  
  27.   SELECT CustomerID, CompanyName  
  28.   FROM Northwind.dbo.Customers  
  29.   WHERE Country = N'UK';  
  30.   
  31. SELECT CustomerID, KeyCol FROM @NewCusts;  
  32. GO  

注意代码中被注释掉的第二个OUTPUT子句,后面没有INTO子句.如果还要输出返回给调用方,取消注释即可.这样,INSERT语句将包含两个OUTPUT子句. 

示例2. 

  1. USE AdventureWorks;  
  2. GO 
  3. CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))  
  4. DECLARE @TmpTable TABLE (ID INT, TEXTVal VARCHAR(100))  
  5.  
  6. INSERT TestTable (ID, TEXTVal)  
  7. OUTPUT Inserted.ID, Inserted.TEXTVal INTO @TmpTable  
  8. VALUES (1,'FirstVal')  
  9. INSERT TestTable (ID, TEXTVal)  
  10. OUTPUT Inserted.ID, Inserted.TEXTVal INTO @TmpTable  
  11. VALUES (2,'SecondVal')  
  12.  
  13. SELECT * FROM @TmpTable  
  14. SELECT * FROM TestTable  
  15.  
  16. DROP TABLE TestTable  
  17. GO  
  1. USE AdventureWorks;  
  2. GO  
  3. CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))  
  4.  
  5. INSERT TestTable (ID, TEXTVal)  
  6. OUTPUT Inserted.ID, Inserted.TEXTVal  
  7. VALUES (1,'FirstVal')  
  8. INSERT TestTable (ID, TEXTVal)  
  9. OUTPUT Inserted.ID, Inserted.TEXTVal  
  10. VALUES (2,'SecondVal')  
  11. DROP TABLE TestTable  
  12. GO  

二.带有OUTPUT的DELETE的应用. 

如果要删除数据的同时,还需要记录日志,或者归档数据.在DELETE中使用OUTPUT子句在适合不过了. 

  1. USE AdventureWorks;  
  2. GO  
  3. CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))  
  4. DECLARE @TmpTable TABLE (ID INT, TEXTVal VARCHAR(100))  
  5. INSERT TestTable (ID, TEXTVal)  
  6. VALUES (1,'FirstVal')  
  7. INSERT TestTable (ID, TEXTVal)  
  8. VALUES (2,'SecondVal')  
  9.  
  10. DELETE  
  11. FROM TestTable  
  12. OUTPUT Deleted.ID, Deleted.TEXTVal INTO @TmpTable  
  13. WHERE ID IN (1,2)  
  14.  
  15. SELECT * FROM @TmpTable  
  16. SELECT * FROM TestTable  
  17. DROP TABLE TestTable  
  18. GO  

三.带有OUTPUT的UPDATE的应用  

  1. USE AdventureWorks;  
  2. GO  
  3. CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))  
  4. DECLARE @TmpTable TABLE (ID_New INT, TEXTVal_New VARCHAR(100),ID_Old INT, TEXTVal_Old VARCHAR(100))  
  5. INSERT TestTable (ID, TEXTVal)  
  6. VALUES (1,'FirstVal')  
  7. INSERT TestTable (ID, TEXTVal)  
  8. VALUES (2,'SecondVal')  
  9. UPDATE TestTable  
  10. SET TEXTVal = 'NewValue'  
  11. OUTPUT Inserted.ID, Inserted.TEXTVal, Deleted.ID, Deleted.TEXTVal INTO @TmpTable  
  12. WHERE ID IN (1,2)  
  13.  
  14. SELECT * FROM @TmpTable  
  15. SELECT * FROM TestTable  
  16. DROP TABLE TestTable  
  17. GO  

sql server 带有OUTPUT的INSERT,DELETE,UPDATE的更多相关文章

  1. 带有OUTPUT的INSERT,DELETE,UPDATE

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

  2. Use Select To Generate Any Insert/Delete/Update Statement

    If you don't have the permission to generate script according to an existing db, but you have the re ...

  3. sqlserver触发器insert,delete,update

    Create Trigger [dbo].[upemployee_kefyu_sale] on [dbo].[employee] for update as if update(FullName) b ...

  4. MySQL进阶10--DML数据操纵预言: insert/delete/update --多表连接修改/.多表连接删除/多表连接查询-- truncate 和 delete的区别

    /* DML -- 数据操纵预言: insert/delete/update */ #一: 插入语句 /* 语法1: insert into 表名(列名,..,列名....) values(值1,值2 ...

  5. sql server 中一次insert 多条的写法

    1.SELECT INTO FROM语句 注意此处 要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中.示例如下 2.INSERT ...

  6. sql server 存储过程 output 和return的使用 方法,详解

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  7. SQL Server 2005 导出包含(insert into)数据的SQL脚本 (使用存储过程) 分类: 数据库

    CREATE PROCEDURE dbo.UspOutputData @tablename sysname AS ) ) ) declare @xtype tinyint declare @name ...

  8. 使用mybatis执行对应的SQL Mapper配置中的insert、update、delete等标签操作,数据库记录不变

    我使用springMVC集成mybatis,执行SQLMapper配置文件里的insert操作,发现程序没有报错,但数据库表里却没有刚才插入的记录.查了很多资料,终于在一篇博客上找到了答案:在执行完方 ...

  9. SQL Server 使用 OUTPUT做数据操作记录

    OUTPUT 子句 可以在数据进行增删改的时候,可以返回受影响的行.先准备一张表 create table #t ( id int identity primary key ,name ) ) go ...

随机推荐

  1. 九 DIP 依赖倒置原则

    首先看定义: 1.高层模块不依赖于低层模块,两者都应该依赖于抽象层 2.抽象不能依赖于细节,细节必须依赖于抽象 首先,模块是个抽象的概念,可以大到一个系统中的子系统作为一个模块,也可以是某个子系统中的 ...

  2. vue components & `@import css` bug

    vue components @import css not support css3 @import https://github.com/vuejs/vue-loader/issues/138#i ...

  3. 在Linux上录制终端的操作

    在Linux上录制终端的操作 来源 http://blog.51cto.com/stuart/1831570 一.安装基础软件包 1 [root@test software]# yum install ...

  4. HDU 2546 饭卡(01 背包)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 思路:需要首先处理一下的的01背包,当饭卡余额大于等于5时,是什么都能买的,所以题目要饭卡余额最小, ...

  5. echarts异步加载

    echarts体积很大,在移动端使用异步加载是一种提高渲染速度的方法,结合webpack的做法如下: require.ensure([], function(require){ const echar ...

  6. bzoj4772 显而易见的数论

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4772 sol :这个题卡了我一整天QAQ 出题人简直丧心病狂,卡内存+卡常数QAQ 题意就是, ...

  7. poj 1037 三维dp

    A decorative fence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7221   Accepted: 272 ...

  8. 遍历Collection集合中的6种方法:

    下面的代码演示了遍历Collection集合的6种方法,注意Collection集合的遍历远不止于增强for循环,和迭代器两种. 代码如下: package com.qls.traverse; imp ...

  9. shortcut(NOIP模拟赛)(裸的排序)

    原题: Description Mirek有一条每天从他家去大学工作的最喜欢的路.这个路径由若干个部分组成,且每个部分是10米长的直线.每一个部分是直线连接(没有拐弯)上一个部分或垂直连接上一个部分. ...

  10. 疫情控制(NOIP2012)庆祝2012满贯!٩(๑•◡-๑)۶ⒽⓤⒼ

    丧病至极的D2T3啊! 好吧~ 先放个传送门~ 原题传送门 好吧,这道题呢.. 根据题意我们可以很明显的看出来 军队往上走的越多(在没到根节点之前),效益一定越大.. 所以可以分情况讨论: 对于无法走 ...