| 
示例:使用 CLR 流式表值函数的解决方案 
 该解决方案包括以下步骤:(a) 定义 CLR 类 SqlReaderBase,它实现了 ISqlReader,并且通过在 XML 实例上应用路径表达式来生成流式表值输出;(b) 创建一个程序集和一个 T-SQL 用户定义函数 (UDF) 来激活该 CLR 类;(c) 使用 UDF 定义插入、更新和删除触发器,以维护属性表。 
 首先,创建流式 CLR 函数,其主干如下所示。XML 数据类型被公开为 ADO.NET 中的托管类 SqlXml;它支持返回 XmlReader 的方法 CreateReader()。 
 
 
| public class c_streaming_xml_tvf {
public static ISqlReader streaming_xml_tvf 
(SqlXml xmlDoc, string pathExpression) {
return (new TestSqlReaderBase (xmlDoc, pathExpression));
}
}
// Class that implements ISqlReader
public class TestSqlReaderBase : ISqlReader {
XPathNodeIterator m_iterator;         
???public SqlChars FirstName;
// Metadata for current resultset
private SqlMetaData[] m_rgSqlMetaData;      
public TestSqlReaderBase (SqlXml xmlDoc, string pathExpression) {   
// Variables for XPath navigation
      XPathDocument xDoc;
      XPathNavigator xNav;
      XPathExpression xPath;
      // Set sql meta data
      m_rgSqlMetaData = new SqlMetaData[1];
      m_rgSqlMetaData[0] = new SqlMetaData ("FirstName",  
SqlDbType.NVarChar,50);   
      //Set up the Navigator
      if (!xmlDoc.IsNull)
          xDoc = new XPathDocument (xmlDoc.CreateReader());
      else
          xDoc = new XPathDocument ();
      xNav = xDoc.CreateNavigator();
      xPath = xNav.Compile (pathExpression);
      m_iterator = xNav.Select(xPath);
}
public bool Read() {
      bool moreRows = true;
      if (moreRows = m_iterator.MoveNext())
      ???FirstName = new SqlChars (m_iterator.Current.Value);
      return moreRows;
}
} |  接下来,创建一个程序集,以及一个与 CLR 函数 streaming_xml_tvf 对应的 T-SQL 用户定义函数 SQL_streaming_xml_tvf(未显示)。该 UDF 用于定义表值函数 CLR_udf_XML2Table 以便生成行集: 
 create function CLR_udf_XML2Table (@pk int, @xCol xml) 
 returns @ret_Table table (FK int, FirstName varchar(max)) 
 with schemabinding 
 as 
 begin 
 insert into @ret_Table 
 select @pk, FirstName 
 FROM SQL_streaming_xml_tvf (@xCol, '/book/author/first-name') 
 return 
 end  |