如何使用SQL Server 2000中的XML功能(下)
2007-11-11 13:38:40 来源:WEB开发网核心提示: 插入和更新由sql server(WINDOWS平台上强大的数据库平台) sp_xml(标准化越来越近了)_preparedocument系统存储过程准备的xml(标准化越来越近了)文档可像其他任何表一样用于JOIN中,它们也可像其他任何行集合一样用于INSERT、UPDATE或DELETE记录,如何使用SQL Se
插入和更新
由sql server(WINDOWS平台上强大的数据库平台) sp_xml(标准化越来越近了)_preparedocument系统存储过程准备的xml(标准化越来越近了)文档可像其他任何表一样用于JOIN中。它们也可像其他任何行集合一样用于INSERT、UPDATE或DELETE记录。为了证明这一点,首先从OrderID 10285选择一系列Order Details行,并将它们填入一个ADO.NET数据集。然后,通过更改它们的数量和向该数据集添加若干Order Details行,修改某些现有的Order Details行,如下面的代码片断所示:
作了这些更改之后,该数据集给出了关于如何取用该数据集中已更改的数据并将其转变为xml(标准化越来越近了)的若干个选项。可以使用Writexml(标准化越来越近了)方法写出作为DiffGram的数据、带有或不带有其架构的数据。还可以使用Getxml(标准化越来越近了)方法将数据置入xml(标准化越来越近了)。本例将使用DiffGram,因为它将包含修改行以及各行在修改前后的状态(用于UPDATES)。
DiffGram被传递给一个存储过程(如图 8所示),该存储过程从xml(标准化越来越近了)文档取出新的和更新的行,并将它们插入一个TABLE变量(@tblTemp)。请注意,图 8中的OPENxml(标准化越来越近了)函数使用XPath表达式来获取hasChanges属性的值。对于插入行该值为i,对于修改行为m。由于OPENxml(标准化越来越近了)函数能够筛选出行,因此只需将一个xml(标准化越来越近了)文档传递给该存储过程。接下来,适当的行被插入Order Details表,然后适当的Order Details行被更新。INSERT和UPDATE都被包装在一个事务内部,因此无论哪一个失败都可以回滚。
图 8 使用DiffGram进行插入和更新
CREATE PROCEDURE prInsertUpdateOrderDetailsFromxml(标准化越来越近了) @sxml(标准化越来越近了) NTEXTAS DECLARE @iDoc int, @OrderID int EXEC sp_xml(标准化越来越近了)_preparedocument @iDoc output, @sxml(标准化越来越近了), '<ns xml(标准化越来越近了)ns:diffgr="urn:schemas-microsoft-com:xml(标准化越来越近了)-diffgram-v1" xml(标准化越来越近了)ns:msdata="urn:schemas-microsoft-com:xml(标准化越来越近了)-msdata"/>' IF @@Error<>0 BEGIN RETURN END BEGIN TRANSACTION DECLARE @tblTemp TABLE ( OrderID INT, ProductID INT, UnitPrice MONEY, Quantity SMALLINT, Discount REAL, ChangeType CHAR(1) ) INSERT INTO @tblTemp (OrderID, ProductID, UnitPrice, Quantity, Discount, ChangeType) SELECT OrderID, ProductID, ProductPrice, ProductQTY, Discount, ChangeType FROM Openxml(标准化越来越近了)(@iDoc, '/diffgr:diffgram/NorthwindOrderDetailsData/OrderDetails', 2) WITH (OrderID INT 'OrderID', ProductID INT 'ProductID', ProductPrice MONEY 'UnitPrice', ProductQTY SMALLINT 'Quantity', Discount REAL 'Discount', ChangeType CHAR(1) '@diffgr:hasChanges') IF @@Error<>0 BEGIN EXEC sp_xml(标准化越来越近了)_removedocument @iDoc ROLLBACK TRANSACTION RETURN END EXEC sp_xml(标准化越来越近了)_removedocument @iDoc INSERT INTO [Order Details] (OrderID, ProductID, UnitPrice, Quantity, Discount) SELECT OrderID, ProductID, UnitPrice, Quantity, Discount FROM @tblTemp WHERE ChangeType = 'i' IF @@Error<>0 BEGIN ROLLBACK TRANSACTION RETURN END UPDATE [Order Details] SET UnitPrice = t.UnitPrice, Quantity = t.Quantity, Discount = t.Discount FROM @tblTemp t, [Order Details] od WHERE t.ChangeType = 'm' AND od.OrderID = t.OrderID AND od.ProductID = t.ProductID IF @@Error<>0 BEGIN ROLLBACK TRANSACTION RETURNENDCOMMIT TRANSACTIONGO
更多精彩
赞助商链接