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
foreign keys, primary keys, SQL Server 2008, T-SQL, XML, 主键, 外键