关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »SQL Server 2005的XML支持与异常处理(1)

    SQL Server 2005的XML支持与异常处理(1)

    2015-11-29 00:00:00 出处:ITJS
    分享

    SQL Server 2005 包括对Transact-SQL (T-SQL) 语言的几项重要改进。新增功能之一是一种新的触发器,它在数据定义语言 (DDL) 语句运行时激发。在跟踪或保护数据库对象的创建和修改,或对数据库服务器进行更改时,DDL 触发器非常有用。另一个新功能涉及异常处理,该功能因包含TRY/CATCH 块而在异常处理方面向前飞跃了一大步。另一组新功能则以新的XML数据类型为中心,该数据类型在与SQL Server交互的企业应用程序中管理XML数据方面前进了一大部。现在,XML 文档或片段可以存储于 XML 列、绑定到架构、还可以利用 XQuery 语法查询。本文汇总各类问题来做出详细解答。

    问:类型化和非类型化 XML 列各自的优势是什么

    答:非类型化 XML 列可以存储所有格式规范的 XML 片段或文档,而类型化 XML 列可以绑定到 XML 架构。假如不确定 XML 将遵循哪个架构,则非类型化 XML 很有用。例如,假如您必须使用另一个应用程序的某些 XML,但无法确定数据将遵循哪个 XML 架构,则可以使用非类型化 XML 列来执行这项工作。当然,非类型化 XML 也会带来其他问题。例如,不能针对某个架构编程,因此很难有效地使用 XML。但有时无法避免非类型化 XML。创建非类型化 XML 列非常简单,如下所示:

    CREATE TABLE Foo(FooID INT, someXml XML)

    架构不绑定到 XML 列的另一个结果是,SQL Server® 2005 会将非类型化 XML 作为一个字符串存储。这是件好事还是坏事 实际上,既是好事也是坏事。将 XML 作为字符串存储使您可以更灵活地存储任何 XML 片段或文档。根据应用程序的业务规则,您可能需要这种方式。另一方面,将 XML 作为字符串存储意味着,与类型化 XML 相比,既不能有效地存储也不能有效地搜索 XML 数据。并且既不会告诉 SQL Server XML 将包含哪些内容,也不会告诉它层次结构和 XML 节点的数据类型。但请记住,仅仅因为这些是非类型化 XML 列并不意味着它们可以接受您设计出的任何格式。类型化和非类型化 XML 列仍然只接受格式规范的 XML。

    假如您要存储架构已知的 XML 文档,类型化 XML 列很理想。架构可以定义元素、属性、它们的数据类型、需要哪些字段以及数据的整个层次结构。由于这种详细信息有关 XML 列的数据,因此 SQL Server 2005 可以在内部更加有效地存储 XML 数据。假如您尝试存储与架构不匹配的 XML 数据,则 SQL Server 会检测到这一点并阻止您。

    创建类型化 XML 列就像在括号中添加架构名称一样简单,如下所示:

    CREATE TABLE Foo(FooID INT, someXml XML(CONTENT FooSchema))

    该语句指出 someXml 列必须遵循名为 FooSchema 的 XML 架构集合。通过分别包含相应的关键字 DOCUMENT 或 CONTENT,XML 可指定为必须是一个文档或者可以包含一个片段。假如省略,则默认值为 CONTENT。

    可以使用 T-SQL 命令将 XML 架构集合添加到数据库中,如下所示:

    CREATE XML SCHEMA COLLECTION [FooSchema] AS N 'put your schema here'

    也可以使用 SQL Server Management Studio (SSMS) 创建 XML 架构集合模板。从 View 菜单打开 Template Explorer,然后导航到 XML Schema Collections 节点并展开它。然后,您可以双击 CREATE 模板打开一个模板,该模板为您创建 XML 架构集合提供了一个良好的语法开端(参见图 1)。

    图1:XML架构集合模板是SSMS

    SQL Server 2005 随附的 AdventureWorks 数据库有一个名为 HumanResources.JobCandidate 的表。该表包含一个名为 Resume 的列,该列是一个绑定到架构集合 HumanResources.HRResumeSchemaCollection 的 XML 列。该列中存储的所有 XML 数据都必须遵循该架构。

    图2:Resume架构

    类型化和非类型化 XML 列都可以进行索引,但索引时,绑定到架构的 XML 列比非类型化 XML 列具有更多优点。将 XML 索引应用于非类型化 XML 列时,必须分析大部分 XML 结构来定位匹配的节点。但是,将 XML 索引应用于类型化 XML 列时,特定节点是可识别的并可根据架构定位。因此,索引可以在类型化 XML 中更有效地工作,因为它知道在哪里查找。此外,假如需要搜索一个数值范围,则索引将用非类型化 XML 执行一个数据类型转换(因为数据类型是未知的)。类型化 XML 定义自己的数据类型,从而避免了转换开销。

    问:我刚刚将 SQL Server 2000 数据库迁移到 SQL Server 2005。我听说 SQL Server 2005 在 T-SQL 中引入了 TRY/CATCH 异常处理。与现有的 IF @@ERROR <> 0 技术相比,新的异常处理如何工作呢

    答:通常对使用 T-SQL 编写代码的抱怨是,T-SQL 始终缺少一个健壮的异常处理结构。通过 SQL Server 2000,您可以编写 T-SQL 批处理代码,以检查是否存在错误甚至何时引发错误(假如需要)。但与 TRY/CATCH 技术相比,执行此操作的技术是最基本的。首先,我将使用 @@ERROR 函数定义与异常处理相关联的问题,然后展示新的 TRY/CATCH 技术与之相比是如何执行的。

    SQL Server 公开内置的 @@ERROR 函数,该函数返回所执行的上一条 T-SQL 命令的错误号。该函数的问题在于,它始终返回从刚刚执行的上一个语句返回的错误。这意味着,假如您执行一个导致错误的 INSERT 语句,然后执行另一个不会导致错误的任意 SQL 语句,之后再查看 @@ERROR 的返回值,则该函数将返回 0,原因是上一个语句没有返回错误。您必须十分小心,以确保在执行每个单独语句之后检查 @@ERROR 的值。

    BEGIN TRANSACTION 

    问:我知道可以创建触发器来审核对数据的更改,但是假如表的架构发生更改,我如何执行操作呢

    答:我在简介中提到过,现在有了一个新的触发器:SQL Server 2005 中的 DDL 触发器。数据操作语言 (DML) 触发器基于数据操作激发,而 DDL 触发器在对数据库架构或服务器进行更改时激发。创建的 DDL 触发器只能在发生触发事件之后激发,而 DML 触发器则不同,它可以在事件之后或代替事件激发。以下是创建 DDL 触发器的语法,在 SQL Server 2005 文档中进行了概述:

    CREATE TRIGGER trigger_name 

    CREATE_PROCEDURE

          QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />

    显示执行以下命令后该触发器的事件数据:

    create proc test1 as select getdate 

    您还可以捕获事件数据,并将其完整存储到审核表的 XML 列中。另一个选择是抽出特定节点的内容,并将其单独存储。显然,实现视具体情况而定,但 DDL 触发器为您提供的选择有很多。使用 DDL 触发器时需要记住的一件事是,它们是同步操作的。由于是同步执行,触发器应该尽可能不执行费时的操作。否则,它们会对数据库服务器的性能造成负面影响。与 DML 触发器一样,应该将 DDL 触发器定义为仅执行所需的操作并快速完成。假如需要异步执行,可以使用 Service Broker 和 Event Notification 模型。

    SQL Server 2005 包括对Transact-SQL (T-SQL) 语言的几项重要改进。新增功能之一是一种新的触发器,它在数据定义语言 (DDL) 语句运行时激发。在跟踪或保护数据库对象的创建和修改,或对数据库服务器进行更改时,DDL 触发器非常有用。另一个新功能涉及异常处理,该功能因包含TRY/CATCH 块而在异常处理方面向前飞跃了一大步。另一组新功能则以新的XML数据类型为中心,该数据类型在与SQL Server交互的企业应用程序中管理XML数据方面前进了一大部。现在,XML 文档或片段可以存储于 XML 列、绑定到架构、还可以利用 XQuery 语法查询。本文汇总各类问题来做出详细解答。

    问:类型化和非类型化 XML 列各自的优势是什么

    答:非类型化 XML 列可以存储所有格式规范的 XML 片段或文档,而类型化 XML 列可以绑定到 XML 架构。假如不确定 XML 将遵循哪个架构,则非类型化 XML 很有用。例如,假如您必须使用另一个应用程序的某些 XML,但无法确定数据将遵循哪个 XML 架构,则可以使用非类型化 XML 列来执行这项工作。当然,非类型化 XML 也会带来其他问题。例如,不能针对某个架构编程,因此很难有效地使用 XML。但有时无法避免非类型化 XML。创建非类型化 XML 列非常简单,如下所示:

    CREATE TABLE Foo(FooID INT, someXml XML)

    架构不绑定到 XML 列的另一个结果是,SQL Server® 2005 会将非类型化 XML 作为一个字符串存储。这是件好事还是坏事 实际上,既是好事也是坏事。将 XML 作为字符串存储使您可以更灵活地存储任何 XML 片段或文档。根据应用程序的业务规则,您可能需要这种方式。另一方面,将 XML 作为字符串存储意味着,与类型化 XML 相比,既不能有效地存储也不能有效地搜索 XML 数据。并且既不会告诉 SQL Server XML 将包含哪些内容,也不会告诉它层次结构和 XML 节点的数据类型。但请记住,仅仅因为这些是非类型化 XML 列并不意味着它们可以接受您设计出的任何格式。类型化和非类型化 XML 列仍然只接受格式规范的 XML。

    假如您要存储架构已知的 XML 文档,类型化 XML 列很理想。架构可以定义元素、属性、它们的数据类型、需要哪些字段以及数据的整个层次结构。由于这种详细信息有关 XML 列的数据,因此 SQL Server 2005 可以在内部更加有效地存储 XML 数据。假如您尝试存储与架构不匹配的 XML 数据,则 SQL Server 会检测到这一点并阻止您。

    创建类型化 XML 列就像在括号中添加架构名称一样简单,如下所示:

    CREATE TABLE Foo(FooID INT, someXml XML(CONTENT FooSchema))

    该语句指出 someXml 列必须遵循名为 FooSchema 的 XML 架构集合。通过分别包含相应的关键字 DOCUMENT 或 CONTENT,XML 可指定为必须是一个文档或者可以包含一个片段。假如省略,则默认值为 CONTENT。

    可以使用 T-SQL 命令将 XML 架构集合添加到数据库中,如下所示:

    CREATE XML SCHEMA COLLECTION [FooSchema] AS N 'put your schema here'

    也可以使用 SQL Server Management Studio (SSMS) 创建 XML 架构集合模板。从 View 菜单打开 Template Explorer,然后导航到 XML Schema Collections 节点并展开它。然后,您可以双击 CREATE 模板打开一个模板,该模板为您创建 XML 架构集合提供了一个良好的语法开端(参见图 1)。

    图1:XML架构集合模板是SSMS

    SQL Server 2005 随附的 AdventureWorks 数据库有一个名为 HumanResources.JobCandidate 的表。该表包含一个名为 Resume 的列,该列是一个绑定到架构集合 HumanResources.HRResumeSchemaCollection 的 XML 列。该列中存储的所有 XML 数据都必须遵循该架构。

    图2:Resume架构

    类型化和非类型化 XML 列都可以进行索引,但索引时,绑定到架构的 XML 列比非类型化 XML 列具有更多优点。将 XML 索引应用于非类型化 XML 列时,必须分析大部分 XML 结构来定位匹配的节点。但是,将 XML 索引应用于类型化 XML 列时,特定节点是可识别的并可根据架构定位。因此,索引可以在类型化 XML 中更有效地工作,因为它知道在哪里查找。此外,假如需要搜索一个数值范围,则索引将用非类型化 XML 执行一个数据类型转换(因为数据类型是未知的)。类型化 XML 定义自己的数据类型,从而避免了转换开销。

    问:我刚刚将 SQL Server 2000 数据库迁移到 SQL Server 2005。我听说 SQL Server 2005 在 T-SQL 中引入了 TRY/CATCH 异常处理。与现有的 IF @@ERROR <> 0 技术相比,新的异常处理如何工作呢

    答:通常对使用 T-SQL 编写代码的抱怨是,T-SQL 始终缺少一个健壮的异常处理结构。通过 SQL Server 2000,您可以编写 T-SQL 批处理代码,以检查是否存在错误甚至何时引发错误(假如需要)。但与 TRY/CATCH 技术相比,执行此操作的技术是最基本的。首先,我将使用 @@ERROR 函数定义与异常处理相关联的问题,然后展示新的 TRY/CATCH 技术与之相比是如何执行的。

    SQL Server 公开内置的 @@ERROR 函数,该函数返回所执行的上一条 T-SQL 命令的错误号。该函数的问题在于,它始终返回从刚刚执行的上一个语句返回的错误。这意味着,假如您执行一个导致错误的 INSERT 语句,然后执行另一个不会导致错误的任意 SQL 语句,之后再查看 @@ERROR 的返回值,则该函数将返回 0,原因是上一个语句没有返回错误。您必须十分小心,以确保在执行每个单独语句之后检查 @@ERROR 的值。

    BEGIN TRANSACTION 

    CREATE_PROCEDURE

          QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />

    显示执行以下命令后该触发器的事件数据:

    create proc test1 as select getdate 

    您还可以捕获事件数据,并将其完整存储到审核表的 XML 列中。另一个选择是抽出特定节点的内容,并将其单独存储。显然,实现视具体情况而定,但 DDL 触发器为您提供的选择有很多。使用 DDL 触发器时需要记住的一件事是,它们是同步操作的。由于是同步执行,触发器应该尽可能不执行费时的操作。否则,它们会对数据库服务器的性能造成负面影响。与 DML 触发器一样,应该将 DDL 触发器定义为仅执行所需的操作并快速完成。假如需要异步执行,可以使用 Service Broker 和 Event Notification 模型。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。