带有OUTPUT的INSERT,DELETE,UPDATE
原文地址: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函数即可实现.
- -- Generating Surrogate Keys for Customers
- USE tempdb;
- GO
- IF OBJECT_ID('dbo.CustomersDim') IS NOT NULL
- DROP TABLE dbo.CustomersDim;
- GO
- CREATE TABLE dbo.CustomersDim
- (
- KeyCol INT NOT NULL IDENTITY PRIMARY KEY,
- CustomerID NCHAR(5) NOT NULL,
- CompanyName NVARCHAR(40) NOT NULL,
- );
- -- Insert New Customers and Get their Surrogate Keys
- DECLARE @NewCusts TABLE
- (
- CustomerID NCHAR(5) NOT NULL PRIMARY KEY,
- KeyCol INT NOT NULL UNIQUE
- );
- INSERT INTO dbo.CustomersDim(CustomerID, CompanyName)
- OUTPUT inserted.CustomerID, inserted.KeyCol
- INTO @NewCusts
- -- OUTPUT inserted.CustomerID, inserted.KeyCol
- SELECT CustomerID, CompanyName
- FROM Northwind.dbo.Customers
- WHERE Country = N'UK';
- SELECT CustomerID, KeyCol FROM @NewCusts;
- GO
注意代码中被注释掉的第二个OUTPUT子句,后面没有INTO子句.如果还要输出返回给调用方,取消注释即可.这样,INSERT语句将包含两个OUTPUT子句.
示例2.
- USE AdventureWorks;
- GO
- CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))
- DECLARE @TmpTable TABLE (ID INT, TEXTVal VARCHAR(100))
- INSERT TestTable (ID, TEXTVal)
- OUTPUT Inserted.ID, Inserted.TEXTVal INTO @TmpTable
- VALUES (1,'FirstVal')
- INSERT TestTable (ID, TEXTVal)
- OUTPUT Inserted.ID, Inserted.TEXTVal INTO @TmpTable
- VALUES (2,'SecondVal')
- SELECT * FROM @TmpTable
- SELECT * FROM TestTable
- DROP TABLE TestTable
- GO
- USE AdventureWorks;
- GO
- CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))
- INSERT TestTable (ID, TEXTVal)
- OUTPUT Inserted.ID, Inserted.TEXTVal
- VALUES (1,'FirstVal')
- INSERT TestTable (ID, TEXTVal)
- OUTPUT Inserted.ID, Inserted.TEXTVal
- VALUES (2,'SecondVal')
- DROP TABLE TestTable
- GO
二.带有OUTPUT的DELETE的应用.
如果要删除数据的同时,还需要记录日志,或者归档数据.在DELETE中使用OUTPUT子句在适合不过了.
- USE AdventureWorks;
- GO
- CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))
- DECLARE @TmpTable TABLE (ID INT, TEXTVal VARCHAR(100))
- INSERT TestTable (ID, TEXTVal)
- VALUES (1,'FirstVal')
- INSERT TestTable (ID, TEXTVal)
- VALUES (2,'SecondVal')
- DELETE
- FROM TestTable
- OUTPUT Deleted.ID, Deleted.TEXTVal INTO @TmpTable
- WHERE ID IN (1,2)
- SELECT * FROM @TmpTable
- SELECT * FROM TestTable
- DROP TABLE TestTable
- GO
三.带有OUTPUT的UPDATE的应用
- USE AdventureWorks;
- GO
- CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))
- DECLARE @TmpTable TABLE (ID_New INT, TEXTVal_New VARCHAR(100),ID_Old INT, TEXTVal_Old VARCHAR(100))
- INSERT TestTable (ID, TEXTVal)
- VALUES (1,'FirstVal')
- INSERT TestTable (ID, TEXTVal)
- VALUES (2,'SecondVal')
- UPDATE TestTable
- SET TEXTVal = 'NewValue'
- OUTPUT Inserted.ID, Inserted.TEXTVal, Deleted.ID, Deleted.TEXTVal INTO @TmpTable
- WHERE ID IN (1,2)
- SELECT * FROM @TmpTable
- SELECT * FROM TestTable
- DROP TABLE TestTable
- GO
带有OUTPUT的INSERT,DELETE,UPDATE的更多相关文章
- sql server 带有OUTPUT的INSERT,DELETE,UPDATE
原文:sql server 带有OUTPUT的INSERT,DELETE,UPDATE OUTPUT是SQL SERVER2005的新特性.可以从数据修改语句中返回输出.可以看作是"返回结果 ...
- 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 ...
- sqlserver触发器insert,delete,update
Create Trigger [dbo].[upemployee_kefyu_sale] on [dbo].[employee] for update as if update(FullName) b ...
- MySQL进阶10--DML数据操纵预言: insert/delete/update --多表连接修改/.多表连接删除/多表连接查询-- truncate 和 delete的区别
/* DML -- 数据操纵预言: insert/delete/update */ #一: 插入语句 /* 语法1: insert into 表名(列名,..,列名....) values(值1,值2 ...
- OUTPUT 在insnert delete update 的神奇功效
Inserted deleted 个人理解 应该是两个 临时表 分别存储 变动后的数据集 和 变动前的数据集 使用例子: 1.对于INSERT,可以引用inserted表以查询新行的属性 ...
- 触发器内insert,delete,update判断执行不同的内容
create trigger tr_aon afor insert,update,delere asbegin IF EXISTS(SELECT 1 FROM inserted) AND NOT EX ...
- MyBatis insert/delete/update 的返回值
insert,返回值是:新插入行的主键(primary key):需要包含<selectKey>语句,才会返回主键,否则返回值为null. <insert id="inse ...
- executenonquery只对insert,delete,update有效,查询select会默认返回-1
问题:cmd.ExecuteNonQuery() 方法总是返回-1 原因:ExecuteNonQuery() 方法 select 返回-1 解释:执行Select子句,数据库并无变化,自然返回-1同样 ...
- sql server中带有output的DML
OUTPUT是SQL SERVER2005的新特性.可以从数据修改语句中返回输出.可以看作是"返回结果的DML".INSERT,DELETE,UPDATE均支持OUTPUT子句.在 ...
随机推荐
- 实现AT24C02的数据读写操作
/*************************************************************** 功能:11:32 2008-6-27 作者:SG 时间:2004-03 ...
- WPF笔记(2.7 文字布局)——Layout
原文:WPF笔记(2.7 文字布局)--Layout 这一节介绍的是文字布局的几个控件:1.TextBlock 最基本的文字控件可以配置5个Font属性.TextWraping属性,&quo ...
- MSSQL 镜像
1.设置数据库CollectionDB 为完整备份模式服务端: USE master ALTER DATABASE CollectionGuest SET RECOVERY FULL GO 镜相端: ...
- powershell 将文本转换成表格的还有一种方式
$text=" 1 梦幻西游 216406 2014-01-21 资料片 2 炉石传说 15905 2014-01-24 公測 3 新大话西游 214465 2002-08-01 公測 4 ...
- spring boot1.3.0版本及以上版本profile指定参数无法被打入
现象:小于1.3.0版本如1.2.6的spring boot, 当指定profile进行参数打入的时候,发现没有问题,但是比如改用1.3.0,1.3.1及其以上版本的时候,发现参数打不进去,经过比对s ...
- 使用zeranoe的自动化脚本mingw-w64-build-3.6.4在ubutun14.04_64bit上交叉编译ffmpeg 2.5
编译期间,碰到的两个大问题,是环境变量设置问题. 先列出执行脚本是碰到的两个问题,后面给出解决方法并记录执行的命令步骤. 问题1: 编译binutils 2.5出错 ----------------- ...
- 读取本地文件理解FileReader对象的方法和事件以及上传按钮的美化。
一.FileReader对象 用来把文件读入内存,并且读取文件中的数据.FileReader对象提供了异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据. 浏览器支持情况, ...
- C#中操作刚导出的Excel,设置其为自动调整列宽
[问题] 用C#导出数据为excel,但是导出的数据中,不是自动调整列宽的: 希望变成这样的: [解决过程] 1.参考: 在C#里对excel文件的列宽进行操作 去试试: //auto adjust ...
- Oozie — What Why and How
Oozie是什么? Oozie最初是Yahoo!为Hadoop开发的一个工作流调度器,一个工作流有多个Job组成.它允许用户提交由多个Job组成的工作流配置文件,这些Job既可以顺序执行,也可以并行执 ...
- java使用注解和反射打造一个简单的jdbc工具类
a simple jdbc tools 如有转载和引用,请注明出处,谢谢 1. 定义我们需要的注解 要想实现对数据库的操作,我们必须知道数据表名以及表中的字段名称以及类型,正如hibernate 使用 ...