原文: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. Gradle 的项目导入到 IntelliJ 后子项目源代码不能导入

    在一个 Gradle 项目中,有若干子项目. 当 Gradle 到如后,子项目不能被 IntelliJ  识别代码. 如下图的这个代码就没有被自动识别. 这个有可能是因为你的这个子项目没有被添加到父项 ...

  2. hdu 2510

    Tiling_easy version Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  3. 【luoguUVA1316】 Supermarket--普通并查集+贪心

    题目描述 有一个商店有许多批货,每一批货又有N(0<=N<=10^4 )个商品,同时每一样商品都有收益P_iPi​ ,和过期时间D_iDi​ (1<=Pi,,Di <=10^4 ...

  4. python音频处理

    第一步:先下载ffmpeg-->下载链接 下载好解压到某个文件夹,并将该文件夹中的bin目录添加到系统path. 第二步:安装pydub pip3 install pydub # -*- cod ...

  5. 查看API工具 https://editor.swagger.io/

    The base URL for the API is:    https://api.cloud.nalantis.com/api/ The OpenAPI documentation is ava ...

  6. Makefile规则介绍

    Makefile 一个规则 三要素:目标,依赖,命令     目标:依赖 命令 1.第一条规则是用来生成终极目标的规则     如果规则中的依赖不存在,向下寻找其他的规则 更新机制:比较的是目标文件和 ...

  7. 如何知道,当前redis实例是处于阻塞状态?

    随便get一个key,然后卡着不动就行,简单粗暴.优雅一点是看latency的延迟,blocked_clients的数量,rejected_connections的数量等 或者 方法一:登录 Redi ...

  8. 我的zshrc文件设置备份

    # If you come from bash you might have to change your $PATH. # export PATH=$HOME/bin:/usr/local/bin: ...

  9. 手把手教你在Linux系统下安装MongoDB

    1. 下载最新的stable版MongoDB [root@spirit-of-fire ~]# wget http://downloads.mongodb.org/linux/mongodb-linu ...

  10. 【零基础】彻底搞懂51单片机各种型号(ATMEL系列)

    零.前言 初学者开始学习51单片机时往往先是一愣,说好51单片机啊,咋个型号是AT89C52,这个S52又是咋回事?上学的时候大都懵懵懂懂就这么用着,但始终没整明白,所以今天我们就彻底搞明白这些“51 ...