技术开发 频道

SQL Server 2000对XML的支持

  【IT168技术文档】

  SQL Server 2000对XML的支持(一)

  SQL Server 2000就已经有了对XML的支持,这种支持主要体现在FOR XML子句和SQLXML上。然而,这些支持并不充分,因为在SQL Server 2000里,归根结底是用关系型的数据表来模拟XML数据,由于关系型数据先天上的缺点,让它模拟表现力和扩展性更强的XML数据必然模拟得不伦不类,要实现具有一定格式的XML代码,往往需要写很复杂的SQL语句。此外,由于SQL Server 2000发布得比较早,它对XPath的支持也不全面,更不要说现在的XQuery了。因此,在真实项目中,一旦遇到比较复杂的XML,往往很少会使用FOR XML子句,而是直接将XML代码保存在数据表的text类型字段中。然而,text字段是不会对XML代码是否完整以及是否符合某个Schema的格式而进行验证的。于是,采用得比较多的办法是用对XML支持比较强的语言在客户端对XML进行操作,然后更新到数据库中。但是,对保存在text字段中的XML代码进行查询的效率就很难保证了。
XML数据类型

  在SQL Server 2005中,对XML的支持得到了很好的加强。最关键的一点就是,微软在SQL Server 2005中提供了一个新的数据类型,即XML数据类型,从此告别了用关系型数据来模拟XML数据的历史。因此,以后XML数据可以直接保存到数据表的一个字段中了。

  XML数据类型是一用专门用于保存和操作XML的数据类型。它是以BLOB的二进制形式保存的,一个XML类型字段可以保存2GB的XML代码,层次可达128层。此外,XML数据类型还有检验XML数据完整性的功能,比以前用text类型保存XML数据方便得多。

  如下代码就创建了一个带有XML类型字段xCol的数据表docs,并且为该字段添加了一个“书籍作者的姓和名不能相等”的用自定义函数实现的约束,最后还插入了一条记录。

CREATE FUNCTION udf_Check_Names (@xmlData XML) RETURNS INT AS BEGIN RETURN (SELECT @xmlData.exist('/book/author[first-name = last-name]')) END GO CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML NOT NULL CONSTRAINT CK_name CHECK (dbo.udf_Check_Names(xCol) = 0)) GO INSERT INTO docs VALUES (1, '<book genre="security" publicationdate="2002" ISBN="0-7356-1588-2"> <title>Writing Secure Code</title> <author> <first-name>Michael</first-name> <last-name>Howard</last-name> </author> <author> <first-name>David</first-name> <last-name>leBlanc</last-name> </author> <price>33.99</price> </book>')

  XML字段与Schema Collection的绑定

  在SQL Server 2005中,XML类型的字段是可以和XML Schema绑定的。Schema被放在一个叫Schema Collection的集合里,一个Collection可以放多个Schema,而XML字段是直接和Collection绑定的,XML字段的值只要和Collection中的任何一个Schema匹配就可以了。

  与Collection绑定的XML字段被称为Typed XML类型的字段,而没有与Collection绑定的XML字段则被称为Untyped XML类型的字段。对于Typed XML来说,绑定方式还可以有DOCUMENT和CONTENT两种。如果是DOCUMENT,表示字段内的数据必须是一个完成的XML文档,最顶层元素也只能有一个;而如果是CONTENT,则表示字段内的数据只需要是一个片断即可,而最顶层元素也可以有多个。

  如下代码创建了一个名为myCollection的Schema Collection,然后创建了一个新的数据表XmlCatalog,把它的document字段和myCollection匹配。这样一来,插入到document字段的XML数据就必须与myCollection中的Schema相匹配,否则SQL Server 2005将会拒绝插入。

CREATE XML SCHEMA COLLECTION myCollection AS '<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://myBooks" elementFormDefault="qualified" targetNamespace="http://myBooks"> <xsd:element name="bookstore" type="bookstoreType" /> <xsd:complexType name="bookstoreType"> <xsd:sequence maxOccurs="unbounded"> <xsd:element name="book" type="bookType" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="bookType"> <xsd:sequence> <xsd:element name="title" type="xsd:string" /> <xsd:element name="author" type="authorName" /> <xsd:element name="price" type="xsd:decimal" /> </xsd:sequence> <xsd:attribute name="genre" type="xsd:string" /> <xsd:attribute name="publicationdate" type="xsd:string" /> <xsd:attribute name="ISBN" type="xsd:string" /> </xsd:complexType> <xsd:complexType name="authorName"> <xsd:sequence> <xsd:element name="first-name" type="xsd:string" /> <xsd:element name="last-name" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema>' CREATE TABLE XmlCatalog ( ID INT PRIMARY KEY, Document XML(CONTENT myCollection))
0
相关文章