关闭 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 模型。

    上一篇返回首页 下一篇

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

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    最全面的前端开发指南

    Windows7任务栏桌面下角的一些正在运行的图标不见了

    sql server快速删除记录方法

    SQL Server 7移动数据的6种方法

    SQL Server 2008的新压缩特性

    每个Java程序员必须知道的5个JVM命令行标志

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

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