sql server 带有OUTPUT的INSERT,DELETE,UPDATE

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 原文: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 存储
如何在 SQL Server 中使用 `OUTPUT` 子句
【8月更文挑战第10天】
127 7
如何在 SQL Server 中使用 `OUTPUT` 子句
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
70 1
|
4月前
|
SQL 关系型数据库 MySQL
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
53 5
|
4月前
|
SQL 安全 关系型数据库
关系型数据库SQL server DELETE 语句
【8月更文挑战第3天】
121 10
|
4月前
|
SQL 关系型数据库 数据库
关系型数据库SQL server UPDATE 语句
【8月更文挑战第3天】
99 10
|
4月前
|
SQL 关系型数据库 BI
关系型数据库SQL server INSERT 语句
【8月更文挑战第3天】
84 9
|
3月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
114 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
1月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第16天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括配置系统源、安装 SQL Server 2019 软件包以及数据库初始化,确保 SQL Server 正常运行。
|
1月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
|
1月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。