WEB开发网
开发学院数据库MSSQL Server SQL2005用XML数据类型进行数据建模 阅读

SQL2005用XML数据类型进行数据建模

 2007-05-19 09:42:35 来源:WEB开发网   
核心提示: 更新触发器:在与更新的 XML 实例对应的属性表中删除现有行,并且在该属性表中插入新行create trigger trg_docs_UPDon Tfor updateasif update(xCol) or update(pk)begindeclare @FK intdeclare @w

更新触发器:在与更新的 XML 实例对应的属性表中删除现有行,并且在该属性表中插入新行

create trigger trg_docs_UPD
on T
for update
as
if update(xCol) or update(pk)
begin
   declare @FK int
   declare @wantedXML xml
   select @FK = PK from deleted
   delete tblPropAuthor where propPK = @FK
select @wantedXML = xCol from inserted
select @FK = pk from inserted
insert into tblPropAuthor
   select * from dbo.udf_XML2Table(@FK, @wantedXML)
end

示例:查找作者的名字为"David"的 XML 实例

可以在 XML 列上表示该查询。另外,还可以在属性表中搜索名字"David",然后与基表执行向后联接以返回 XML 实例,如下所示:

SELECT xCol
FROM   T JOIN tblPropAuthor ON T.pk = tblPropAuthor.propPK
WHERE  tblPropAuthor.propAuthor = 'David'

示例:使用 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;
}
}

上一页  5 6 7 8 9 10 

Tags:SQL XML 数据

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接