sql server 带有OUTPUT的INSERT,DELETE,UPDATE

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文:sql server 带有OUTPUT的INSERT,DELETE,UPDATE OUTPUT是SQL SERVER2005的新特性.
原文: 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语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
4月前
|
SQL Oracle 关系型数据库
SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语
SELECT INTO 语句将数据从一个表复制到一个新表中。
62 1
|
4月前
|
SQL 数据库
SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用
NULL 值是指字段没有值的情况。如果表中的字段是可选的,那么可以插入新记录或更新记录而不向该字段添加值。此时,该字段将保存为 NULL 值。需要注意的是,NULL 值与零值或包含空格的字段不同。具有 NULL 值的字段是在记录创建期间留空的字段。
56 0
|
4月前
|
SQL Oracle 关系型数据库
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
49 0
|
1月前
|
SQL 存储 关系型数据库
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
|
23天前
|
SQL 关系型数据库 MySQL
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
14 0
|
1月前
|
数据库
SQLSERVER 2014 删除数据库定时备份任务提示失败DELETE 语句与 REFERENCE 约束“FK_subplan_job_id“冲突
SQLSERVER 2014 删除数据库定时备份任务提示失败DELETE 语句与 REFERENCE 约束“FK_subplan_job_id“冲突
|
4月前
|
SQL 数据库
SQL INSERT INTO 语句详解:插入新记录、多行插入和自增字段
SQL INSERT INTO 语句用于在表中插入新记录。
198 0
|
8天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
51 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改