- SQL Server许多方面都用到了XML:
- SQL Server可以存储XML数据、XML架构、根据XML架构验证XML数据
- DDL触发器返回事件详细数据是XML数据结构(EVENTDATA)的,导致触发器被触发
- Extended events返回的trace数据是XML格式的
- Logon触发器返回的详细数据和DDL触发器是相似的,都是EVENTDATA结构的
- Service Broker中传输的数据都是基于XML的
- Event notifications通过Service Broker队列发送DDL事件详细信息。这些通知都是基于XML的
- XML是纯文本、基于Unicode的元数据语言(描述语言的语言),用来保存结构化和半结构化的数据,不和任何编程语言、操作系统或者供应商相关,提供了大量的操作、结构化、传输和查询数据的方法;用来在不同的系统之间交换数据,是自描述的语言
- 结构良好的XML只有一个顶级元素,包含多个顶级元素的文档称为片段
- XML是一个集合名称用作元素或者属性名称,避免名称冲突;所有的命名空间都是用xmlns属性,属性值是一个合法的URI,使用URI作为命名空间的名称,主要是为了不重复,他们不是真正指向一个资源,也可以提供其他容易理解的形式
- XML schema描述了XML文档的结构,XML schema语言也被称为XML Schema Definition(XSD),提供了验证约束,定义如下:
- 可以在文档中出现的元素
- 可以在文档中出现的属性
- 那些元素是子元素
- 子元素的顺序
- 子元素的数量
- 元素是否可以为空或者是否可以包含文本
- 元素和属性的数据类型
- 元素和属性的默认值和固定值
- 在SQL Server中XML数据的原因
- 你希望以高效的方式分享、查询和修改XML
- 在关系数据和XML数据之间进行交互
- 跨越应用程序域进行交互,需要数据最大的灵活性,其他系统可能使用完全不同的技术,不是使用同样的方式展示数据
- 你可能无法预先知道数据的结构,通常都是结构化和半结构化的数据的混合,比如一个表将不是很结构化的数据存储在XML列中
- 你可能有非常稀疏的数据,比如一个表有上千列,只有很少的列或者行有数据,直接使用XML类型数据,不在使用关系数据
- 数据可能需要顺序,关系表和视图是没有隐式的顺序的,XML文档可以展示可以按顺序展示数据
- 希望SQL Server验证你的XML数据,使其在处理前满足特定的XML schema
- 希望在XML数据上创建索引,使其查询更快
- SQL Server为了更容易处理,不是按照原始输入存储XML数据,它都是使用内部形式存储数据,这两种形式是等价的,比如输入为<Customer Name="Terry"></Customer>,其内存存储形式为<Customer Name="Terry"/>
- SQL Server中有XML SCHEMA COLLECTION对象,用于保存XML Schema集合,验证XML实例,在被存储到数据库中时type XML数据,当你将XML SCHEMA COLLECTION对象和一个XML变量、参数、列关联时,存储XML的位置至少要符合一个XML Schema;sys.xml_schema_collections系统视图提供已经存在的XML schema collections详细信息,sys.xml_schema_namespaces系统视图提供XML schema collections引用的命名空间的详细信息;XML schema collections也不是按其输入的格式存储,而是转化为内部格式
- 当不想让XML数据拥有schema或者不想让服务器验证数据(执行验证对服务器产生严重的性能影响),就使用untyped XML数据类型;当你拥有并且想要服务器验证XML数据、想要利用基于type信息的存储和查询优化、想要在编译查询时利用type信息,使用typed XML数据类型(这里的type指的是schema的类型)
- 当指定XML数据类型时,可以指定是否可以存储XML Fragment,如果使用了CONTENT关键字就可以存储XML Fragment,该选项是默认选项;如果使用了DOCUMENT关键字,就不允许存储XML Fragment,只能存储格式良好的XML
- XML数据不是直接以文本形式在SQL Server中存储,为了查询方便,它被分解成对象树形式,使其在内存中更容易定位;即使这样处理起来也慢的话,可以创建索引,XML索引是XML对象树的副本,用来快速重用;XML索引比底层XML数据大很多,而关系索引一般都比底层表小
- SQL Server共支持四种类型XML索引:
- Primary XML Index,提供持久化对象树,该树是从XML的结构形成的,用来加速元素和属性的访问,避免每次查询都遍历整个XML文档的需要,创建该索引时,要求必须首先建立聚集主键
- Second XML Index,共有三种类型该索引:PATH、VALUE、PROPERTY,每一种类型都针对一种类型的查询;PATH索引帮助决定元素或者属性的路径是否合法,典型应用于XQuery的exist方法;VALUE索引帮助获取元素或者属性的值;PROPERTY索引通过路径表达式检索多个值;只有创建完Primary XML Index后才可以创建Second XML Index,并且在创建Second XML Index时,还需要引用Primary XML Index
Primary XML Index可以通过SSMS和T-SQL命令创建,Second XML Index只能通过T-SQL命令创建