- 关 键 词:
- sql server
- asp.net
- 存储过程
- html
- iis
引用:http://www.qqread.com/sqlserver/2008/02/s396521.htmlOPENXML
到此为止我们已经探讨了从SQL Server获取XML的方法。下一步将是在数据库中使用XML来修改数据。输入OPENXML函数。T-SQL OPENXML函数能够从XML流构建关系行集合。该行集合可以执行像表一样的操作,因此可用于可能与其他表联接的其他SQL语句中,甚至可用于插入或更新数据。这可以提供很大方便,因为这样可以将包含需要在数据库中修改的新的或更新的记录XML流传递给某一应用程序。OPENXML函数使用某种形式的Xpath,以便用户能够告诉它在何处搜索想要取出的数据。
为此,首先取一个包含客户数据的XML文档,并将其插入到Northwind数据库的Customers表中。该XML文档可能使用元素或属性来表示该客户的数据,如下所示:
OPENXML语句允许用户使用XPath表达式来深入了解XML文档,这意味着XML的格式可以相当灵活。
下面创建了一个存储过程(如图 6所示),用于接受该XML文档,为关系行集合准备该XML文档,读取客户数据,将其插入到Customers表,然后从内存删除该XML文档。现在我们来看这一切是如何实现的。首先,可以在XML中作为任意字符串类型(如VARCHAR(8000)或大对象类型如TEXT或NTEXT)的变量传递。我们使用NTEXT,以便不受VARCHAR的8,000字符限制。NTEXT的最大长度为230 - 1(1,073,741,823)个字符。(当然,在SQL Server 2005中还可以使用XML数据类型。)
图 6 通过OPENXML插入Customer
更多内容请看SQL Server 数据处理专题、SQL Server 索引和查询专题、SQL Server专题,或进入讨论组讨论。
到此为止我们已经探讨了从SQL Server获取XML的方法。下一步将是在数据库中使用XML来修改数据。输入OPENXML函数。T-SQL OPENXML函数能够从XML流构建关系行集合。该行集合可以执行像表一样的操作,因此可用于可能与其他表联接的其他SQL语句中,甚至可用于插入或更新数据。这可以提供很大方便,因为这样可以将包含需要在数据库中修改的新的或更新的记录XML流传递给某一应用程序。OPENXML函数使用某种形式的Xpath,以便用户能够告诉它在何处搜索想要取出的数据。
为此,首先取一个包含客户数据的XML文档,并将其插入到Northwind数据库的Customers表中。该XML文档可能使用元素或属性来表示该客户的数据,如下所示:
<root> <customer> <custid>77777</custid> <custname>fake customer</custname> <city>Somewhere</city> <country>USA</country> </customer> </root>
OPENXML语句允许用户使用XPath表达式来深入了解XML文档,这意味着XML的格式可以相当灵活。
下面创建了一个存储过程(如图 6所示),用于接受该XML文档,为关系行集合准备该XML文档,读取客户数据,将其插入到Customers表,然后从内存删除该XML文档。现在我们来看这一切是如何实现的。首先,可以在XML中作为任意字符串类型(如VARCHAR(8000)或大对象类型如TEXT或NTEXT)的变量传递。我们使用NTEXT,以便不受VARCHAR的8,000字符限制。NTEXT的最大长度为230 - 1(1,073,741,823)个字符。(当然,在SQL Server 2005中还可以使用XML数据类型。)
图 6 通过OPENXML插入Customer
CREATE PROCEDURE prInsertCustomerFromXML ( @sXML NTEXT ) AS DECLARE @iDoc INT EXEC sp_xml_preparedocument@iDoc OUTPUT, @sXML INSERT INTO Customer(CustomerID, CompanyName, City, Country) SELECT CustomerID, CompanyName, City, Country FROM OPENXML(@iDoc,'/root/customer',2) WITH (CustomerID NCHAR(5) 'custid', CompanyName NVARCHAR(40) 'custname', City NVARCHAR(15) 'city', Country NVARCHAR(15) 'country') EXEC sp_xml_removedocument@iDoc RETURN
对XML所做的第一件事是将其传递给sp_xml_preparedocument系统存储过程。该过程取用该XML并将其转换成内部DOM,以便OPENXML能够将它作为行集合来处理。该过程还在内存中创建一个DOM引用(图 6中的@iDoc变量)。通过将@iDoc变量传递给OPENXML函数,可以在SELECT语句的FROM子句中将XML作为行集合来访问。
使用完XML后,应使用sp_xml_removedocument系统存储过程从内存中删除之。
图 6中的代码核心是OPENXML函数,它对该XML文档的内存表达式执行操作。OPENXML方法将该XML文档的引用作为其第一个参数来接受。其第二个参数用于告诉OPENXML用户想映射到行的XML DOM中的节点。在这个例子中,我们想识别Customers节点以获取该客户的数据值,因此我们将“/root/customer”指定为第二个参数。OPENXML函数的第三个参数是用于指示要使用的映射类型。取值为1时,OPENXML映射到属性,取值为2时则映射到元素。
WITH子句可用于指定要从该XML文档获取的字段以及要转换成的数据类型。WITH子句也可用于在XML中用XPath表达式来映射属性或元素,或用于为要用于某一查询的XML字段取别名。图 6中的OPENXML代码主要是从XML数据中取4个客户字段,并将其转换成行集合。然后可以从Customers表选择该行集合,或插入到其中。
(待续.......)
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- SQL Server 数据处理专题 (1856篇文章)
- SQL Server 索引和查询专题 (3323篇文章)
- SQL Server (1813篇文章)
- XML详解 (1543篇文章)
- 开发应用 (622篇文章)
- SQL Server (1815篇文章)



