添加业务逻辑
可以采用多种方式将业务逻辑添加到 XML 数据中:
您可以编写行或列约束,以在插入和修改 XML 数据时强制实施特定于域的约束。
您可以在 XML 列上编写插入或更新列中的值时激发的触发器。该触发器可以包含特定于域的验证规则或填充属性表。
从 SQL Server 2005 开始,数据库引擎具有了执行托管代码的能力。您可以使用此公共语言运行时 (CLR) 集成使用托管代码编写要向其传递 XML 值的函数,并且使用 System.Xml 命名空间提供的 XML 处理功能。例如,将 XSL 转换应用到 XML 数据。另外,您可以将 XML 反序列化为一个或多个托管类,并使用托管代码对它们进行操作。
您可以编写 Transact-SQL 存储过程和函数,对 XML 列进行处理以满足业务需要。
示例:应用 XSL 转换
考虑一个 CLR 函数 TransformXml(),该函数接受 xml 数据类型实例和存储在文件中的 XSL 转换,并对 XML 数据应用转换,然后在结果中返回转换的 XML。以下是用 C# 编写的主干函数:
public static SqlXml TransformXml (SqlXml XmlData, string xslPath) {
// Load XSL transformation
XslCompiledTransform xform = new XslCompiledTransform();
XPathDocument xslDoc = new XPathDocument (xslPath);
xform.Load(xslDoc);
// Load XML data
XPathDocument xDoc = new XPathDocument (XmlData.CreateReader());
// Return the transformed value
MemoryStream xsltResult = new MemoryStream();
xform.Transform(xDoc, null, xsltResult);
SqlXml retSqlXml = new SqlXml(xsltResult);
return (retSqlXml);
}
注册程序集并创建用户定义 Transact-SQL 函数之后(SqlXslTransform() 对应于 TransformXml()),便可从 Transact-SQL 中调用该函数,如以下查询所示:
SELECT SqlXslTransform (xCol, 'C:\MyFile\xsltransform.xsl')
FROM T
WHERE xCol.exist('/book/title/text()[contains(.,"custom")]') =1
查询结果包含转换的 XML 的行集。
集成到 SQL Server 中的 CLR 扩展了这样一些可能性:将 XML 数据分解到多个表或属性提升,以及通过使用 System.Xml 命名空间中的托管类查询 XML 数据。有关详细信息,请参阅公共语言运行时 (CLR) 集成概述。