3.4 将数据插入XML数据类型列
无论XML列是类型化还是非类型化,开发人员都可采用以下方式为XML列提供值:(1)作为可隐式转换为XML数据类型的字符或者二进制SQL类型;(2)作为文件内容;(3)作为可生成XML数据类型实例的,包括TYPE指令的FOR XML语句输出。
提供的值必须经过格式良好的验证,这样才能存储XML文档和XML片段。如果数据未通过格式良好验证,那么将显示适当的错误消息来拒绝。对于类型化XML,检测提供的值是为了XML架构集合中XML架构测定XML列的一致性要求。如果验证失败,则拒绝XML实例。下面查看一下将值插入XML列中不同方法的示例:
首先,以下语句将整数列ID的值2和XmlData列的<customer>实例作为新行插入Customer表中。以字符串形式提供的<customer>实例会被隐式转换为XML数据类型,同时在插入过程中检测其是否格式良好:
INSERT INTO Customer values (2, '<customer id="2"正如前文提到的,对于Insert命令,还可能利用XML文件内容作为输入。以下XML文档存储在名为Customer.xml文件中:
xmlns="http://www.wrox.com/books"><name>Joe</name></customer>')
<customer id="6" xmlns="http://www.wrox.com/books">如果执行以下T-SQL命令,将把Customer.xml文件内容加载到XmlData列中:
<name>Dave</name>
</customer>
INSERT INTO Customer SELECT 7, xml_value FROM对于Insert命令而言,第三种方式是利用包括TYPE指令的FOR XML的输出作为输入。在SQL Server 2005中,使用包括TYPE指令的FOR XML能够将结果生成为XML数据类型实例。XML结果能够赋值给XML列,变量或者参数。在以下语句中,使用FOR XML TYPE将生成的XML实例赋值给XML数据类型变量@var。然后,在INSERT语句中使用该变量:
(SELECT * FROM OPENROWSET (BULK 'C:\Data\Customer.xml',
SINGLE_BLOB) AS xml_value) AS R(xml_value)
DECLARE @var xml3.5 XML数据类型方法
SET @var = (SELECT XmlData FROM Customer FOR XML AUTO,TYPE)
-- 将变量值插入新表CustomerOutput中
CREATE TABLE CustomerOutput (XmlData xml)
INSERT INTO CustomerOutput (XmlData) VALUES (@var)
虽然XML数据类型是内置数据类型,但是通过提供一些查询和更新存储在XML变量或者列中数据的方法,它的功能类似于用户定义数据类型(UDT)。开发人员可使用这些方法查询,获取标量值,以及修改存储在变量,列或者参数中的XML文档。下表列举了XML数据类型方法 。

4. 小结
由于XML在计算机世界中是一种无孔不入的语言,所以SQL Server 2005和ADO.NET对XML提供功能丰富的内置支持是合乎逻辑的。本文展示了SQL Server 2005的XML功能。如果正确使用,那么这些XML功能可为整个架构带来有意义的变化。