存档

文章标签 ‘XML’

SQL Server 2008中的XML-XML数据类型(续)

2009年12月12日

  SQL server 2005中引入了一个新的数据类型:xml.这个新数据类型是用来操作XML数据的,现在SQL Server 2008进一步增强了它的功能。使用这种新的数据类型,可以以本机格式存储 XML、 查询 XML 中的数据、 轻松有效地修改 XML 中的数据且无需涉及改动全部的内容,同样也可以索引XML中的数据。

  XML数据类型可以像其它数据一样也可以设置是否可空、设置其默认值以及设置它的约束。如果你想使一个xml字段必须有值且为它提供默认值,你只要像如下指定即可:

  

  CREATE TABLE OrdersXML
     (OrderDocID INT PRIMARY KEY,
     xOrders XML NOT NULL DEFAULT '<Orders/>')
  下列代码也成功运行,是因为它使用了xOrders字段的默认值:
  INSERT INTO OrdersXML (OrderDocID, xOrders) VALUES (3, '<blah>steve</blah>')
  XML架构(XML Schemas)

  XML数据类型的一个强大之处是可以在XML文档中输入强数据类型的能力。XSD(XML架构定义)定义了一组标准,这个标准必须在所有的XML 文档中支持的数据类型。您可以为您的数据创建 XML 架构,要求数据符合一组指定的规则。这使 XML 优越于几乎所有其他数据传输/数据描述方法,也是XML 标准成功一个主要因素。

  如果没有XML架构,XML可能只是相对先进、以文本分隔的格式。XML 架构定义了数据应该是什么样子,什么元素是必须的,会有哪些数据类型。类似 SQL Server 中的表定义提供如何对关系数据的结构和类型进行验证, XML 架构提供 XML 数据的结构和类型验证。

  我们无法在这里完全描述XML 架构的所有功能,因为这需要大量篇幅。您可以在 http://www.w3.org/2001/XMLSchema 找到  XSD 规范。几个受欢迎的架构是公开的,提供包括一个为博客、blogcasts提供支持的真正简单聚合协议 (Really Simple ,RSS),和为二进制文件和文本聚合提供支持的协议,另一个用于该指示 XML Web 服务如何传递信息的 SOAP。

  您可以选择如何构建您的 XSD。XSD 可以创建必需的元素,并设置限制,允许哪些数据类型和范围。它甚至可以允许文档片段。

  SQL Server 架构集合(Schema Collections)

  SQL Server 2005 提供了创建您自己的架构,作为数据库对象并将其存储在数据库中的能力,且为任何 XML 实例提供验证,包括表中的XML字段和 SQL Server 变量。这使您可以更好地控制要存储到数据库中的 XML数据,并可以使XML 实例是强类型的。SQL Server 2008以下列 增强了这种支持:

  • 保留 xsd:dateTime 值中的时区
  • 宽松的验证
  • 架构中的联合和列表类型

  在你深入研究这些新的特性之前,你应该回顾一下架构是如何与SQL Server一起工作的。开始之间,你要先创建一个简单的架构,并将其添加到架构集合中:

 

--syntax for adding a schema
--schema can disallow fragments if you say so
CREATE XML SCHEMA COLLECTION dbo.order_xsd
AS
'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:simpleType name="orderAmt" >
     <xsd:restriction base="xsd:int" >
       <xsd:maxExclusive value="5000" />
       <xsd:minInclusive value="1" />
     </xsd:restriction>
   </xsd:simpleType>
   <xsd:element name="Order">
  <xsd:complexType>
    <xsd:sequence>
    <xsd:element name="CustomerName" type="xsd:string" />
    <xsd:element name="OrderDate" type="xsd:dateTime"/>
    <xsd:element name="OrderAmt" type="orderAmt"/>
    </xsd:sequence>
  </xsd:complexType>
   </xsd:element>
</xsd:schema>'
GO

 

  此架构命名为 order_xsd,并可以在包括变量、 参数、 返回值和特别是表中的列上的xml 类型上使用它。此架构定义了名为 CustomerName、 OrderDate 和 OrderAmt 的元素。OrderAmt 使用了orderAmt类型,orderAmt定义为一个 int 数据类型,它的最小值为 1,它的最大值是 4999 的 orderAmt 类型。(我们知道您将很可能不会这样为您的数据建模,这样一来,但您可能处于用于显示等的目的需要将您关系数据转换成 XML,然后通过一个 XSD 类型进行限制,这是非常有价值的)。接下来,创建一个简单的表并应用架构到 XML 列,这需要在CREATE TABLE 语句中的 xml 数据类型后的括号中引用架构名称,如下所示:

 

--create table with xml column and use schema as a rule for a particular column
CREATE TABLE xml_schematest (
   Order_ID int PRIMARY KEY,
   Order_XML xml(order_xsd) --XML Schema Name
)
GO

 

  在此示例中,您可以看到,Order_XML 列定义为 xml(order_xsd) 而不是简单的 xml。xml 数据类型有一个可选的参数,允许您指定绑定的架构。如果您要将架构绑定到一个变量或参数等之类的 xml 数据类型,也是的同样方法。这样SQL Server 在 Order_XML 列中允许只是强类型化的 XML 文档。这方法比CHECK约束要好。使用 XML 架构的优点是确保只有正确的 XML 数据才能存储到表中。如果使用了 CHECK 约束,你将需要为你想要执行的每个验证绑定一个单独的 CHECK 约束。

  注意:在创建 xml 列时您定义的任何默认值必须是有效的,并和该列绑定的架构没有冲突; 否则,默认值总是失败的。此外,请确保定义的任何约束也是有效的,并和该列绑定的架构没有冲突; 否则,插入或更新数据的所有尝试可能会都失败。

  让我们看一个有关架构的例子:

  

 

INSERT INTO xml_schematest VALUES (1, '
<Order>
  <CustomerName>Bill Gates</CustomerName>
  <OrderDate>2008-10-10T14:22:27.25-05:00</OrderDate>
  <OrderAmt>100</OrderAmt>
</Order>')
--This will fail
INSERT INTO xml_schematest VALUES (2, '
<Order>
  <CustomerName>Steve Ballmer</CustomerName>
  <OrderDate>2008-10-10T14:22:27.25-05:00</OrderDate>
  <OrderAmt>10000</OrderAmt>
</Order>')

 

  SQL Server 执行插入和更新时将验证架构,确保数据的完整性。由于我们所提供的数据符合该架构,插入将会成功。如果您尝试插入或更新一个无效的数据片段,您将收到一个错误:

 

UPDATE xml_schematest
SET Order_XML='
<Order>
  <CustomerName>Bill Gates</CustomerName>
  <OrderDate>2008-10-10T14:22:27.25-05:00</OrderDate>
  <OrderAmt>10000</OrderAmt>
</Order>'
WHERE Order_ID=1

 

  SQL Server将报告如下的错误:

 Msg 6926, Level 16, State 1, Line 1
XML Validation: Invalid simple type value: ’10000′. Location: /*:Order[1]/*:OrderAmt[1]

 

  (未完待续)

  本文首发地址张文杰博客:http://zhangwenjie.net(转载请保留)

SQL Server, 数据库 ,

SQL Server 2008中的XML-XML数据类型

2009年12月5日

  SQL server 2005中引入了一个新的数据类型:xml.这个新数据类型是用来操作XML数据的,现在SQL Server 2008进一步增强了它的功能。使用这种新的数据类型,可以以本机格式存储 XML、 查询 XML 中的数据、 轻松有效地修改 XML 中的数据且无需涉及改动全部的内容,同样也可以索引XML中的数据。您可以以下方式使用 xml :

  • 一个变量
  • 在存储过程或自定义函数中作为参数
  • 自定义函数的返回值
  • 一个表的一列

  在这里您也应应意识到 xml 数据类型的一些限制。虽然xml数据类型可以包含NULL值,但不像其它的本机数据类型,您不能直接比较两个 xml 数据类型的实例。(不过您可以将xml实例转换为 TEXT 数据类型,然后再做比较。)任何相等比较需要先将xml 类型转换为字符类型。此限制也意味着您不能在 ORDER BY 或 GROUP BY子句中使用xml 数据类型。还有几个其他限制,我们稍后会更详细地讨论。

  这似乎是相当严重的限制,但在正确使用时他们不会真正影响到 xml 数据类型。xml 数据类型也有一个丰富的功能集,这算是对这些限制的一些补偿。

  作为变量使用XML数据类型

  让我们首先编写一些使用新的 xml 数据类型的变量的代码。和使用任何其他 TRANSACT-SQL (T-SQL) 变量一样,您只需声明它,然后分配值给它,如在下面的示例中,使用一段XML来表示一个销售代表的数据为:
  DECLARE @xmlData AS XML;
  SET @xmlData=’
   <Customers>
     <CustomerID>TELRK</CustomerID>
     <CompanyName>Telerik, Inc</CompanyName>
     <ContactName>Stephen Forte</ContactName>
     <ContactTitle>Sales Representative</ContactTitle>
     <Address>5-9 Union Square West</Address>
     <City>New York</City>
     <PostalCode>10028</PostalCode>
     <Country>USA</Country>
     <Phone>030-0074321</Phone>
     <Fax>030-0076545</Fax>
   </Customers>’;
  SELECT @xmlData;
  

  这个很基本的示例显示了像声明任何其他任何本机 SQL Server 数据类型一样使用 DECLARE 语句声明一个 XML 变量。该变量然后被分配了一个值。很奇怪的是,一个表示XML 数据的字符串分配给了xml 的数据类型,xml数据奖这个字符串解析成 XML。(同样,基于公共语言运行库用户定义类型也支持且需要相同的功能。)该示例同时还检查XML格式的正确性,如验证元素的开始和结束标记是否匹配。

  最后一个语句通过一个SELECT 语句将XML返回给调用方,结果将在单行单列中显示xml数据。让数据库认识到您正在使用 XML数据 (而不是恰好是 XML的原始文本)的另一个好处是xml数据在 SQL Server Management Studio 呈现为超链接。点击超链接会打开一个新窗口,包含了格式化好的xml数据(使用 Windows Internet Explorer XML 模板),同时带有颜色高亮及可折叠/可展开节点。如果您然后在XML 结果窗口的标题栏上右键单击,您将看到一些有用的选项,如将 XML 保存到文件。

  在表中使用XML数据

  如之前所说,您也可以像如下的例子一样在一个表中将一列定义为xml:

  USE AdventureWorks2008

  GO

  CREATE TABLE OrdersXML
    (OrderDocID int PRIMARY KEY,
     xOrders xml NOT NULL)

  如刚才所说,xml数据类型存在一些限制,在将xml定义为表的一列时限制如下:

  • 它不能定义为主键
  • 它不能定义为外键
  • 不能将它定义为惟一约束(UNIQUE constraint)
  • 不能在定义中使用COLLATE关键字

  我们之前说过不能比较两个xml实例的相等性。主键、外键、惟一约束都需要能比较包含的数据,因此xml数据不能在这些情况下使用。SQL Server的COLLATE语句对xml数据类型来说是没有意义的,因为SQL Server并不是将xml数存储为文本,而是使用特定于xml的编码。

  现在让我们在此列中插入一些数据。这个例子使用硬编码的xml数据,先存放到一个xml变量中,然后插入到我们刚刚创建的OrdersXML表中:

  DECLARE @xmlData AS XML;
   SET @xmlData = ‘
   <Orders>
     <Order>
       <OrderID>5</OrderID>
       <CustomerID>65</CustomerID>
       <OrderAmount>25</OrderAmount>
    </Order>
  </Orders>’;

  INSERT INTO OrdersXML (OrderDocID, xOrders) Values (1, @xmlData);

  你可以有多种方式将xml数据插入到列中:XML Bulk Load(我们稍候会讨论) ;从XML变量中加载(如例子所示);使用FOR XML TYPE特性从SELECT语句中加载,这个一会将讲到。只的格式良好的XML(包括片段)才能插入到表中,任何将非法格式XML数据插入表的尝试将导致一个异常,如下所示:

  INSERT INTO OrdersXML (OrderDocID, xOrders) VALUES (3, ‘<nm>steve</NM>’);

  这将产生如下的错误消息:

  Msg 9436, Level 16, State 1, Line 1
  XML parsing: line 1, character 14, end tag does not match start tag

  (末完待续…)

SQL Server , , , , , ,