热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLSERVER2005中全新的OUTPUT子句添加数据记录详解

也许大家在数据库开发的时候,会发现这样一个现象:添加数据记录后想查看其结果都必须通过select表达式来查询实现。一定都要多此一举才可以看到被添加的数据记录吗?答案是否定的

  也许大家在数据库开发的时候,会发现这样一个现象:添加数据记录后想查看其结果都必须通过select表达式来查询实现。一定都要多此一举才可以看到被添加的数据记录吗?答案是否定的。SQL SERVER 2005新提供的OUTPUT子句就帮您解决这个难题,它以比触发器更简洁的方式,在添加数据记录的同时或者事后显示所添加的数据记录内容。下面是作者通过查找帮助文档MSDN和章立民老师的《SQL Server 2005数据库开发实战》等资料后总结如下:

  理论篇

  OUTPUT子句返回受 INSERT、UPDATE 或 DELETE 语句影响的每行的信息,或者返回基于上述每行的表达式。这些结果可以返回到处理应用程序,以供在确认消息、存档以及其他类似的应用程序要求中使用。此外,也可以将结果插入表或表变量。

  用于:

  DELETE

  INSERT

  UPDATE

  Transact-SQL 语法约定

  语法

   ::=

  {

  [ OUTPUT INTO { @table_variable | output_table } [ ( column_list ) ] ]

  [ OUTPUT ]

  }

   ::=

  { | scalar_expression } [ [AS] column_alias_identifier ]

  [ ,...n ]

   ::=

  { DELETED | INSERTED | from_table_name } . { * | column_name }

  备注

  OUTPUT 子句和 OUTPUT INTO { @table_variable | output_table } 子句可以在单个 INSERT、UPDATE 或 DELETE 语句中定义。

  注意:

  除非另行指定,否则,对 OUTPUT 子句的引用将同时引用 OUTPUT 子句和 OUTPUT INTO 子句。

  OUTPUT 子句对于在 INSERT 或 UPDATE 操作之后检索标识列或计算列的值可能非常有用。

  当 中包含计算列时,输出表或表变量中的相应列并不是计算列。新列中的值是在执行该语句时计算出的值。

  以下语句中不支持 OUTPUT 子句:

  引用本地分区视图、分布式分区视图或远程表的 DML 语句。

  包含 EXECUTE 语句的 INSERT 语句。

  不能将 OUTPUT INTO 子句插入视图或行集函数。

  无法保证将更改应用于表的顺序与将行插入输出表或表变量的顺序相对应。

  如果将参数或变量作为 UPDATE 语句的一部分进行了修改,则 OUTPUT 子句将始终返回语句执行之前的参数或变量的值而不是已修改的值。

  在使用 WHERE CURRENT OF 语法通过游标定位的 UPDATE 或 DELETE 语句中,可以使用 OUTPUT。

  触发器

  从 OUTPUT 中返回的列反映 INSERT、UPDATE 或 DELETE 语句完成之后但在触发器执行之前的数据。

  对于 INSTEAD OF 触发器,即使没有因为触发器的操作而发生修改,也会如同实际执行 INSERT、UPDATE 或 DELETE 那样生成返回的结果。如果在触发器的主体内使用包含 OUTPUT 子句的语句,则必须使用表别名来引用触发器 inserted 和 deleted 表,以免使用与 OUTPUT 关联的 INSERTED 和 DELETED 表复制列引用。

  如果指定了 OUTPUT 子句但未同时指定 INTO 关键字,则对于给定的 DML 操作,DML 操作的目标不能启用对其定义的任何触发器。例如,如果在 UPDATE 语句中定义了 OUTPUT 子句,则目标表不能具有任何启用的 UPDATE 触发器。

  如果设置了 sp_configure 选项 disallow results from triggers,则从触发器内调用语句时,不带 INTO 子句的 OUTPUT 子句将导致该语句失败。

  数据类型

  OUTPUT 子句支持下列大型对象数据类型:nvarchar(max)、varchar(max)、varbinary(max)、 text、ntext、image 和 xml。当在 UPDATE 语句中使用 .WRITE 子句修改 nvarchar(max)、varchar(max) 或 varbinary(max) 列时,如果引用了值的全部前像和后像,则将其返回。在 OUTPUT 子句中,TEXTPTR( ) 函数不能作为 text、ntext 或 image 列的表达式的一部分出现。

  队列

  可以在将表用作队列或将表用于保持中间结果集的应用程序中使用 OUTPUT。换句话说,应用程序不断地在表中添加或删除行。以下示例在 DELETE 语句中使用 OUTPUT 子句将已删除的行返回到执行调用的应用程序。

  

  USE AdventureWorks;

  GO

  DELETE TOP(1) dbo.DatabaseLog WITH (READPAST)

  OUTPUT deleted.*

  WHERE DatabaseLogID = 7;

  GO

  此示例从用作队列的表中删除一行,并使用单个操作将已删除的值返回到处理应用程序。还可实现其他语义,例如使用表来实现堆栈。但是,SQL Server 并不保证由使用 OUTPUT 子句的 DML 语句处理和返回行的顺序。应用程序负责包括可保证所需语义的适当 WHERE 子句,或者理解当针对 DML 操作可能限定多行时,没有保证的顺序。以下示例使用子查询,并假定 DatabaseLogID 列具有唯一性特征才能实现所需的排序语义。

  

  USE AdventureWorks;

  GO

  DELETE dbo.DatabaseLog

  OUTPUT deleted.*

  WHERE DatabaseLogID IN (SELECT TOP(5) DatabaseLogID FROM dbo.DatabaseLog ORDER BY PostTime);

  GO

  注意:

  如果您的方案允许多个应用程序从一个表中执行析构性读取,请在 UPDATE 和 DELETE 语句中使用 READPAST 表提示。这可防止在其他应用程序已经读取表中第一个限定记录的情况下出现锁定问题。

  参数

  @table_variable

  指定一个 table 变量,返回的行将插入该变量中而不是返回到调用方。@table_variable 必须在 INSERT、UPDATE 或 DELETE 语句之前声明。

  如果未指定 column_list,则 table 变量必须与 OUTPUT 结果集具有相同的列数。标识列和计算列除外,这两种列必须跳过。如果指定了 column_list,则任何省略的列都必须允许空值,或者都分配有默认值。

  output_table

  指定一个表,返回的行将被插入该表中而不是返回到调用方。output_table 可以为临时表。

  如果未指定 column_list,则表必须与 OUTPUT 结果集具有相同的列数。标识列和计算列例外,必须跳过这两种列。如果指定了 column_list,则任何省略的列都必须允许空值,或者都分配有默认值。

  output_table 无法应用于以下情况:

  具有启用的对其定义的触发器。

  参与到外键约束双方的任意一方。

  具有 CHECK 约束或启用的规则。

  column_list

  INTO 子句目标表上列名的可选列表。它类似于 INSERT 语句中允许使用的列列表。

  scalar_expression

  可取计算结果为单个值的任何符号和运算符的组合。只要子查询返回单个值,便可使用子查询。scalar_expression 中不允许使用聚合函数。

  对修改的表中的列的任何引用都必须使用 INSERTED 或 DELETED 前缀限定。

  column_alias_identifier

  用于引用列名的替代名称。

  DELETED

  指定由更新或删除操作删除的值的列前缀。以 DELETED 为前缀的列反映 UPDATE 或 DELETE 语句完成之前的值。

  不能在 INSERT 语句中同时使用 DELETED 与 OUTPUT 子句。

  INSERTED

  列的前缀,指定由插入操作或更新操作添加的值。以 INSERTED 为前缀的列反映 UPDATE 或 INSERT 语句完成之后但在触发器执行之前的值。

  INSERTED 语句不能与 DELETE 语句的 OUTPUT 子句同时使用。

  from_table_name

  列的前缀,指定 DELETE 语句或 UPDATE 语句(用于指定要更新或删除的行)的 FROM 子句中所包含的表。

  如果还在 FROM 子句中指定了要修改的表,则对该表中的列的任何引用都必须使用 INSERTED 或 DELETED 前缀限定。

  *

  指定受删除、插入或更新操作影响的所有列都将按照它们在表中的顺序返回。

  例如,以下 DELETE 语句中的 OUTPUT DELETED.* 将返回 ShoppingCartItem 表中所有已删除的列:

  

  DELETE Sales.ShoppingCartItem

  OUTPUT DELETED.*;

  column_name

  显式列引用。任何对修改的表的引用都必须使用相应的 INSERTED 或 DELETED 前缀正确限定,例如:INSERTED.column_name。

  权限

  要求对通过 检索的任何列或者在 中使用的任何列具有 SELECT 权限。

  要求对 中指定的任何表具有 INSERT 权限。

 


推荐阅读
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
  • 云计算的优势与应用场景
    本文详细探讨了云计算为企业和个人带来的多种优势,包括成本节约、安全性提升、灵活性增强等。同时介绍了云计算的五大核心特点,并结合实际案例进行分析。 ... [详细]
  • 当面临数据库清理任务时,若无删除或重建数据库的权限,可以通过编写SQL脚本来实现批量删除用户自定义的数据表和存储过程。本文将详细介绍如何构造这样的SQL脚本。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 开发笔记:由数据库某字段存数组引发的json_encode/serialize思考
    开发笔记:由数据库某字段存数组引发的json_encode/serialize思考 ... [详细]
author-avatar
呼和浩特-时尚范儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有