原文:Update语句的Output从句结构

一,先看1个列子

declare @i table(    id varchar(20),    [name] varchar(20),    address varchar(50),    oldStatus char(1),    newStatus char(1))update top (3) dbo.Table_1 set status = 'C' --2,选择前3条数据output deleted.id,deleted.[name],deleted.address,  --3,输出数据到临时表中(deleted:原始数据 inserted:更新后的新数据)deleted.status,inserted.statusinto @i                                     where status not in('P')                    --1, 过滤不为P状态的数据

二,现在再来看看它的语法结构
返回信息,或基于表达式,影响每一行的INSERT,UPDATE或DELETE语句。这些结果可以退回作为确认消息的事情处理应用程序使用,归档,以及其他类似的应用需求。另外,结果可以插入到一个表或表变量。

<OUTPUT_CLAUSE> ::={    [ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ]    [ OUTPUT <dml_select_list> ]}<dml_select_list> ::={ <column_name> | scalar_expression } [ [AS] column_alias_identifier ]    [ ,n ]<column_name> ::={ DELETED | INSERTED | from_table_name } . { * | column_name }

1,@ table_variable

指定一个表变量,返回的行被插入而不是被返回给调用者进入。 @ table_variable前必须声明的INSERT,UPDATE或DELETE语句。
   如果没有指定column_list中,表变量必须有列的输出结果相同的数。唯一的例外是身份和计算列,必须跳过。如果column_list中指定,任何省略列必须允许空值, 
   或分配给他们的默认值。

A,A. Using OUTPUT INTO with a simple INSERT statement
下面的例子中插入一行的ScrapReason表,并使用OUTPUT子句返回声明的结果@ MyTableVar表变量。由于ScrapReasonID列具有IDENTITY属性的定义,一个值没有规定该列INSERT语句。不过请注意,由数据库引擎生成该列的值在列中OUTPUT子句返回INSERTED.ScrapReasonID。

USE AdventureWorks;GODECLARE @MyTableVar table( ScrapReasonID smallint,                           Name varchar(50),                           ModifiedDate datetime);INSERT Production.ScrapReason    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate        INTO @MyTableVarVALUES (N'Operator error', GETDATE());--Display the result set of the table variable.SELECT ScrapReasonID, Name, ModifiedDate FROM @MyTableVar;--Display the result set of the table.SELECT ScrapReasonID, Name, ModifiedDate FROM Production.ScrapReason;GO

B,Using OUTPUT with an INSERT…SELECT statement
下面的示例创建EmployeeSales的表并插入几行,然后把它通过使用SELECT语句来检索表中的数据源。此外,为列,ProjectedSales,价值计算并插入到表中。 OUTPUT子句返回的INSERT语句的结果给调用应用程序。最后的SELECT语句验证新EmployeeSales的表的内容匹配的OUTPUT子句的结果。

USE AdventureWorks ;GOIF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL    DROP TABLE dbo.EmployeeSales;GOCREATE TABLE dbo.EmployeeSales( EmployeeID   nvarchar(11) NOT NULL,  LastName     nvarchar(20) NOT NULL,  FirstName    nvarchar(20) NOT NULL,  CurrentSales money NOT NULL,  ProjectedSales money NOT NULL);GOINSERT INTO dbo.EmployeeSales     OUTPUT INSERTED.EmployeeID,            INSERTED.LastName,            INSERTED.FirstName,            INSERTED.CurrentSales,           INSERTED.ProjectedSales    SELECT e.EmployeeID, c.LastName, c.FirstName, sp.SalesYTD, sp.SalesYTD * 1.10    FROM HumanResources.Employee AS e        INNER JOIN Sales.SalesPerson AS sp        ON e.EmployeeID = sp.SalesPersonID         INNER JOIN Person.Contact AS c        ON e.ContactID = c.ContactID    WHERE e.EmployeeID LIKE '2%'    ORDER BY c.LastName, c.FirstName;GOSELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSalesFROM dbo.EmployeeSales;GO

C. Using OUTPUT with a DELETE statement
下面的例子中ShoppingCartItem删除表中的所有行。该条款输出删除.*规定,DELETE语句的结果,这是所有删除的行的列,返回给调用应用程序。 SELECT语句后面验证了删除的ShoppingCartItem表操作的结果。

USE AdventureWorks;GODELETE Sales.ShoppingCartItem    OUTPUT DELETED.* ;--Verify all rows in the table have been deleted.SELECT COUNT(*) AS [Rows in Table] FROM Sales.ShoppingCartItem;GO

D. Using OUTPUT INTO with an UPDATE statement

USE AdventureWorks;GODECLARE @MyTableVar table(    EmpID int NOT NULL,    OldVacationHours int,    NewVacationHours int,    ModifiedDate datetime);UPDATE TOP (10) HumanResources.EmployeeSET VacationHours = VacationHours * 1.25 OUTPUT INSERTED.EmployeeID,       DELETED.VacationHours,       INSERTED.VacationHours,       INSERTED.ModifiedDateINTO @MyTableVar;--Display the result set of the table variable.SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDateFROM @MyTableVar;GO--Display the result set of the table.--Note that ModifiedDate reflects the value generated by an--AFTER UPDATE trigger.SELECT TOP (10) EmployeeID, VacationHours, ModifiedDateFROM HumanResources.Employee;GO

E. Using OUTPUT INTO to return an expression
下面的示例建立在定义一个例子,在它们之间的最新VacationHours价值和VacationHours价值的差额OUTPUT子句D表达更新之前应用。这个表达式的值返回到@ MyTableVar列的表中的变量VacationHoursDifference。

USE AdventureWorks;GODECLARE @MyTableVar table(    EmpID int NOT NULL,    OldVacationHours int,    NewVacationHours int,    VacationHoursDifference int,    ModifiedDate datetime);UPDATE TOP (10) HumanResources.EmployeeSET VacationHours = VacationHours * 1.25 OUTPUT INSERTED.EmployeeID,       DELETED.VacationHours,       INSERTED.VacationHours,       INSERTED.VacationHours - DELETED.VacationHours,       INSERTED.ModifiedDateINTO @MyTableVar;--Display the result set of the table variable.SELECT EmpID, OldVacationHours, NewVacationHours,     VacationHoursDifference, ModifiedDateFROM @MyTableVar;GOSELECT TOP (10) EmployeeID, VacationHours, ModifiedDateFROM HumanResources.Employee;GO

F. Using OUTPUT INTO with from_table_name in an UPDATE statement
下面的例子,其中更新了WorkOrder表中与指定的ProductID和ScrapReasonID所有工作订单ScrapReasonID列。在输出到子句返回表中的值被更新(WorkOrder),并从产品表。该产品表用于在FROM子句中指定要更新的行。由于WorkOrder表中有一个AFTER UPDATE触发器定义它,INTO关键字是必需的。

USE AdventureWorks;GODECLARE @MyTestVar table (    OldScrapReasonID int NOT NULL,     NewScrapReasonID int NOT NULL,     WorkOrderID int NOT NULL,    ProductID int NOT NULL,    ProductName nvarchar(50)NOT NULL);UPDATE Production.WorkOrderSET ScrapReasonID = 4OUTPUT DELETED.ScrapReasonID,       INSERTED.ScrapReasonID,        INSERTED.WorkOrderID,       INSERTED.ProductID,       p.Name    INTO @MyTestVarFROM Production.WorkOrder AS wo    INNER JOIN Production.Product AS p     ON wo.ProductID = p.ProductID     AND wo.ScrapReasonID= 16    AND p.ProductID = 733;SELECT OldScrapReasonID, NewScrapReasonID, WorkOrderID,     ProductID, ProductName FROM @MyTestVar;GO

G. Using OUTPUT INTO with from_table_name in a DELETE statement
下面的示例删除了关于在DELETE语句的FROM子句中定义的搜索标准为基础的ProductProductPhoto表行。 OUTPUT子句返回从表中的列被删除(DELETED.ProductID,DELETED.ProductPhotoID)和列从产品表。使用该表,在FROM子句中指定的行删除。

USE AdventureWorksGODECLARE @MyTableVar table (    ProductID int NOT NULL,     ProductName nvarchar(50)NOT NULL,    ProductModelID int NOT NULL,     PhotoID int NOT NULL);DELETE Production.ProductProductPhotoOUTPUT DELETED.ProductID,       p.Name,       p.ProductModelID,       DELETED.ProductPhotoID    INTO @MyTableVarFROM Production.ProductProductPhoto AS phJOIN Production.Product as p     ON ph.ProductID = p.ProductID     WHERE p.ProductModelID BETWEEN 120 and 130;--Display the results of the table variable.SELECT ProductID, ProductName, ProductModelID, PhotoID FROM @MyTableVarORDER BY ProductModelID;GO

H. Using UPDATE with OPENROWSET to modify a varbinary(max) column
下面的例子将取代现有的形象的varbinary(max存储)的一个新的图像列。 OPENROWSET函数是使用BULK选项的加载到列中的形象。此示例假定名为Tires.jpg在指定的文件路径存在的文件。

USE AdventureWorks;GOUPDATE Production.ProductPhotoSET ThumbNailPhoto = (    SELECT *    FROM OPENROWSET(BULK 'c:\Tires.jpg', SINGLE_BLOB)AS x )WHERE ProductPhotoID = 1;GO

BULK 选项
--1,SINGLE_BLOB: 返回的内容data_file为单排,单类型为varbinary(max)列集。 
--2,SINGLE_CLOB: 通过阅读以ASCII data_file,返回为单排,单类型为varchar(max)使用当前数据库的排序规则,列集的内容。
--3,SINGLE_NLOB:通过阅读为Unicode data_file,返回为单排,单类型为nvarchar(max)使用当前数据库的排序规则,列集的内容。

Update语句的Output从句结构的更多相关文章

  1. Select For update语句浅析 (转)

    Select … for update语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句 ...

  2. SQL语句-UPDATE语句

    Update语句 update语句用于修改表中已经存在的数据 单表修改语句结构 多表修改语句结构 update语句的常规用法 update students set sname='abcd',gend ...

  3. SQL语法基础之UPDATE语句

    SQL语法基础之UPDATE语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看UPDATE语句的帮助信息 1>.查看UPDATE的帮助信息 mysql> ? ...

  4. MySQL update 语句与标准SQL不同的地方

    [SQL标准中有一个叫同时执行的概念] 同时执行指的是在同一个子句中的各个部分的执行时机是不区分先后的,如下面的SQL语句 ),); +---------+--------+ ) ) | +----- ...

  5. mysql for update语句

    我们都知道for update语句会锁住一张表,锁表的细节很多人却不太清楚,下面我们举例看下. 在表上我们有个索引,如下: 现在在我们通过索引store_id锁表: 我们再开一个客户端,还是锁住同一个 ...

  6. MySQL复合主键下ON DUPLICATE KEY UPDATE语句失效问题

    问题的起因,假设有一张表,里面保存了交易订单,每张订单有唯一的ID,有最后更新时间,还有数据,详情如下: 1 2 3 4 5 6 7 +-------+----------+------+-----+ ...

  7. 8.INSERT INTO 语句 UPDATE 语句

    1. INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2,....) INSERT INTO Per ...

  8. 学习笔记—— 一些UPDATE语句

    UPDATE语句原来还有许多种写法,有的还很复杂,孤陋寡闻的我甚至闻所未闻.幸甚至哉,记而志之. 0.UPDATE 表名 SET 字段... FROM ...的方式 USE AdventureWork ...

  9. Select For update语句浅析

    Select -forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不 ...

随机推荐

  1. Java进阶知识13 Hibernate查询语言(HQL),本文以hibernate注解版为例讲解

    1.简单概述 1.1. 1) SQL:面向的是数据库 select * from tableName;2) HQL查询(Hibernate Query language): hibernate 提供的 ...

  2. PAT 甲练习 1003 Emergency

    1003 Emergency (25 分) As an emergency rescue team leader of a city, you are given a special map of y ...

  3. java 面试心得总结-BAT、网易

    http://blog.csdn.net/sinat_26812289/article/details/50898693

  4. 数学函数(C/C++)

    C中包含头文件<math.h> C++包含头文件<cmath> 函数 double cos(double) 该函数返回弧度角(double型)的余弦 double tan(do ...

  5. [笔记]C++声明返回数组指针的函数

    数组指针的声明:type (*name)[size]; 由于数组不能拷贝,所以函数不能返回数组.但是函数可以返回指针和引用,所以函数可以返回数组指针或引用. 和数组指针的声明类似: type (*fu ...

  6. SRS之SrsHls::on_audio详解

    1. SrsHls::on_audio 将音频数据封装到 ts 文件中. /* * mux the audio packet to ts. * @param shared_audio, directl ...

  7. centos 如何查看命令是由哪个包提供的

    yum whatprovides */ifconfig Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile ...

  8. Javah提示未找到 ..的类

    Javah相关错误,如下图所示:

  9. IDEA快捷键(修改成eclipse版)+Templates

    快捷键:使用快捷键需要下载改建的配置文件,默认eclipse版的按键还是不全的. 链接:https://pan.baidu.com/s/17H4tFh__k6rExGpAf8NRJg 密码:rnl3 ...

  10. rpm -qa|grep jdk

    转:http://blog.csdn.net/u012110719/article/details/42002221 RPM是RedHat Package Manager(RedHat软件包管理工具) ...