原文: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. HDU 4661 Message Passing ( 树DP + 推公式 )

    参考了: http://www.cnblogs.com/zhsl/archive/2013/08/10/3250755.html http://blog.csdn.net/chaobaimingtia ...

  2. CocoaPods 安装与使用

    1.如果之前已经安装过的 gem list --local | grep cocoapods 会看到如下输出: cocoapods (1.1.1)cocoapods-deintegrate (1.0. ...

  3. mysql慢查询工具

    GeorgeHao 安装过程: [root@localhost-centos6 ~]# wget percona.com/get/pt-query-digest [root@localhost-cen ...

  4. Oracle 对字符串去重函数

    CREATE OR REPLACE FUNCTION ZZMES."REMOVESAMESTR" (oldStr varchar2, sign varchar2) return v ...

  5. 从零开始--Spring项目整合(1)使用maven框架搭建项目

    这些年一直在用spring的框架搭建项目,现在开始我们从零开始利用Spring框架来搭建项目,目前我能想到有Spring.SpringMVC.SpringJDBC.Mybatis.WebSockt.R ...

  6. [ CodeVS冲杯之路 ] P1063

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1063/ 本来是想写石子合并的,结果把题目看错了,写成了合并果子…… 凑合交了上去,直接A了…… 题目将可以将任意两堆合 ...

  7. sqlite3数据库 sqlite3_get_table

    上一篇介绍的sqlite3_exec 是使用回调来执行对select结果的操作.还有一个方法可以直接查询而不需要回调.但是,我个人感觉还是回调好,因为代码可以更加整齐,只不过用回调很麻烦,你得声明一个 ...

  8. Altium 原理图出现元件 “Extra Pin…in Normal of part ”警告

    原理是因为元器件库中的元器件的所有模式MODE不能和pcb中的引进匹配造成的,那什么又是MODE呢, 看下买的图便很清楚了, MODE可以理解为不同的视图模式吧. 然后赶紧打开原理图库中的有问题的元器 ...

  9. Python-mysql索引

    MySQL索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询 ...

  10. Flex与51单片机socket通信 策略问题

    直接把<cross-domain-policy> <allow-access-from domain="*" to-ports="*"/> ...