原文地址:http://blog.sina.com.cn/s/blog_71460d950100nld2.html

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. CREATE TABLE dbo.CustomersDim
  8. (
  9. KeyCol      INT          NOT NULL IDENTITY PRIMARY KEY,
  10. CustomerID  NCHAR(5)     NOT NULL,
  11. CompanyName NVARCHAR(40) NOT NULL,
  12. );
  13. -- Insert New Customers and Get their Surrogate Keys
  14. DECLARE @NewCusts TABLE
  15. (
  16. CustomerID NCHAR(5) NOT NULL PRIMARY KEY,
  17. KeyCol     INT      NOT NULL UNIQUE
  18. );
  19. INSERT INTO dbo.CustomersDim(CustomerID, CompanyName)
  20. OUTPUT inserted.CustomerID, inserted.KeyCol
  21. INTO @NewCusts
  22. -- OUTPUT inserted.CustomerID, inserted.KeyCol
  23. SELECT CustomerID, CompanyName
  24. FROM Northwind.dbo.Customers
  25. WHERE Country = N'UK';
  26. SELECT CustomerID, KeyCol FROM @NewCusts;
  27. 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. INSERT TestTable (ID, TEXTVal)
  6. OUTPUT Inserted.ID, Inserted.TEXTVal INTO @TmpTable
  7. VALUES (1,'FirstVal')
  8. INSERT TestTable (ID, TEXTVal)
  9. OUTPUT Inserted.ID, Inserted.TEXTVal INTO @TmpTable
  10. VALUES (2,'SecondVal')
  11. SELECT * FROM @TmpTable
  12. SELECT * FROM TestTable
  13. DROP TABLE TestTable
  14. GO
  1. USE AdventureWorks;
  2. GO
  3. CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))
  4. INSERT TestTable (ID, TEXTVal)
  5. OUTPUT Inserted.ID, Inserted.TEXTVal
  6. VALUES (1,'FirstVal')
  7. INSERT TestTable (ID, TEXTVal)
  8. OUTPUT Inserted.ID, Inserted.TEXTVal
  9. VALUES (2,'SecondVal')
  10. DROP TABLE TestTable
  11. 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. DELETE
  10. FROM TestTable
  11. OUTPUT Deleted.ID, Deleted.TEXTVal INTO @TmpTable
  12. WHERE ID IN (1,2)
  13. SELECT * FROM @TmpTable
  14. SELECT * FROM TestTable
  15. DROP TABLE TestTable
  16. 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. SELECT * FROM @TmpTable
  14. SELECT * FROM TestTable
  15. DROP TABLE TestTable
  16. GO

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

  1. sql server 带有OUTPUT的INSERT,DELETE,UPDATE

    原文:sql server 带有OUTPUT的INSERT,DELETE,UPDATE 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. OUTPUT 在insnert delete update 的神奇功效

    Inserted   deleted  个人理解 应该是两个 临时表   分别存储 变动后的数据集  和  变动前的数据集 使用例子: 1.对于INSERT,可以引用inserted表以查询新行的属性 ...

  6. 触发器内insert,delete,update判断执行不同的内容

    create trigger tr_aon afor insert,update,delere asbegin IF EXISTS(SELECT 1 FROM inserted) AND NOT EX ...

  7. MyBatis insert/delete/update 的返回值

    insert,返回值是:新插入行的主键(primary key):需要包含<selectKey>语句,才会返回主键,否则返回值为null. <insert id="inse ...

  8. executenonquery只对insert,delete,update有效,查询select会默认返回-1

    问题:cmd.ExecuteNonQuery() 方法总是返回-1 原因:ExecuteNonQuery() 方法 select 返回-1 解释:执行Select子句,数据库并无变化,自然返回-1同样 ...

  9. sql server中带有output的DML

    OUTPUT是SQL SERVER2005的新特性.可以从数据修改语句中返回输出.可以看作是"返回结果的DML".INSERT,DELETE,UPDATE均支持OUTPUT子句.在 ...

随机推荐

  1. 分布式文件系统 fastDFS 安装步骤

    安装 fastDFS 很简单. 先安装 libevent, 安装成功后,安装fastDFS. ./make.sh ./make.sh install 我使用一台tracker服务器  192.168. ...

  2. WPF笔记(1.8 资源与映射)——Hello,WPF!

    原文:WPF笔记(1.8 资源与映射)--Hello,WPF! 终于,看明白了,已经是凌晨1:39分.这本书这一节写得实在是不好,一个local搞得我糊里糊涂,于是,准备按照他的思路,按照我的理解,改 ...

  3. JavaScript加密解密7种方法总结分析

    原文地址:http://wenku.baidu.com/view/9048edee9e31433239689357.html 本文一共介绍了七种javascript加密方法: 在做网页时(其实是网页木 ...

  4. windows套接字相关函数

    windows套接字相关函数 作者:vpoet mail:vpoet_sir@163.com 我们学习TCP/IP协议无非是利用这些协议进行通信开发,然而如果让我们自己来直接根据协议规则和协议格式来进 ...

  5. 三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)

    摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) ...

  6. Unity 集成联通SDK

    我相信Unity程序员都会遇到加入SDK的问题,我相信如果你不会android编程,我相信你的CPU当场计算过快而爆炸!  这里也写笔记希望能帮助大家 如果有讲错的地方,希望大家能回复并且提供答案!  ...

  7. php.ini中最好禁止的一些函数

    phpinfo() 功能描述:输出 PHP 环境信息以及相关的模块.WEB 环境等信息. 危险等级:中 passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 exec(). 危险等级 ...

  8. DNS,ARP,RARP,NAT,WINS的作用和区别

    DNS 域名服务系统,是将域名(比如www.cnblogs.com)转成ip地址.arp 地址转换协议,是将ip地址转成mac地址(物理地址,可用ipconfig /all查看).rarp从mac转到 ...

  9. nth-child和nth-of-type的区别

    以前一般都用:nth-child,后来知道了:nth-of-type,然后就一般用nth-of-type 它们两有什么区别呢? 首先来看个现象: 假如有这样一个HTML结构 <div class ...

  10. ThinkPHP框架搭建及常见问题(Apache或MySQL无法启动)----简单的初体验

    有一定基础的人勿进,这篇讲的只是零基础入门,都是我刚接触以及我所了解到的人刚开始有疑惑的地方,具体框架介绍会在后面的博客中介绍 这一篇只是为了一个简单的页面显示而介绍的方法,不涉及代码,开发环境,所以 ...