如何使用SQL Server 2000中的XML功能(下)
2007-11-11 13:38:40 来源:WEB开发网核心提示: 通过OPENxml(标准化越来越近了)插入 现在我们将用下面的xml(标准化越来越近了)示例从中插入一个定单和两个定单细节行: <Customer CustomerID='ALFKI'><Order OrderDate='1/1/1972' Freight='
通过OPENxml(标准化越来越近了)插入
现在我们将用下面的xml(标准化越来越近了)示例从中插入一个定单和两个定单细节行:
<Customer CustomerID='ALFKI'><Order OrderDate='1/1/1972' Freight='3'><Detail ProductID='1' Price='4' Quantity='10' Discount='0'/><Detail ProductID='2' Price='5' Quantity='2' Discount='0'/></Order></Customer>首先,将该xml(标准化越来越近了)传递给图 7所示的存储过程,并使用sp_xml(标准化越来越近了)_preparedocument系统存储过程准备之。然后启动一个事务来包装INSERT语句,以便插入一个定单及其子记录。这样便可以在部分事务失败时回滚事务。接下来,使用在Customer\Order节点开始的OPENxml(标准化越来越近了)打开xml(标准化越来越近了)文档。利用WITH子句,将xml(标准化越来越近了)文档返回到Order元素(Customer 元素)的父节点,然后查看Customer元素的CustomerID属性值,从而获得CustomerID。这是OPENxml(标准化越来越近了)函数的一个重要功能,因为它让用户使用受限的XPath表达式来遍历xml(标准化越来越近了)文档,从而获得属性和元素值。
图 7 插入父定单及其子定单
CREATE PROCEDURE prInsertOrderAndOrderDetailsFromxml(标准化越来越近了) @sxml(标准化越来越近了) NTEXTASDECLARE @iDoc int, @OrderID intEXEC sp_xml(标准化越来越近了)_preparedocument @iDoc output, @sxml(标准化越来越近了)IF @@Error<>0BEGINRETURNENDBEGIN TRANSACTIONINSERT INTO Orders (CustomerID , OrderDate, Freight)SELECT CustomerID, CAST(OrderDate As datetime), CAST(Freight AS money)FROM Openxml(标准化越来越近了)(@iDoc,'/Customer/Order', 1)WITH (CustomerID nchar(5) '../@CustomerID' ,OrderDate varchar(10) '@OrderDate',Freight varchar(12) '@Freight')IF @@Error<>0BEGINEXEC sp_xml(标准化越来越近了)_removedocument @iDocROLLBACK TRANSACTIONRETURNENDSET @OrderID=SCOPE_IDENTITY()INSERT INTO [Order Details](OrderID, ProductID, UnitPrice, Quantity, Discount)SELECT @OrderID, ProductID, ProductPrice, ProductQTY, DiscountFROM Openxml(标准化越来越近了)(@iDoc,'/Customer/Order/Detail')WITH (ProductID int '@ProductID', ProductPrice money '@Price',ProductQTY smallint '@Quantity', Discount real '@Discount')IF @@Error<>0BEGINEXEC sp_xml(标准化越来越近了)_removedocument @iDocROLLBACK TRANSACTIONRETURNENDEXEC sp_xml(标准化越来越近了)_removedocument @iDocCOMMIT TRANSACTIONSELECT @OrderIDGO
插入Order后,我们获取由内置的sql server(WINDOWS平台上强大的数据库平台) SCOPE_IDENTITY函数刚刚生成的OrderID值。然后我们使用另一个INSERT语句(使用OPENxml(标准化越来越近了)函数从xml(标准化越来越近了)数据中获取Order Details)继续插入Order Details行。只要不出现错误,定单及其子定单细节行就被插入到其各自的数据库表中。
SCOPE_IDENTITY方法使用单个Order及其子定单。不过,以一个xml(标准化越来越近了)批插入多个Order及其子定单的情况比较复杂。问题就是在具有多个Order记录的情况下,仍要能够将适当的定单映射到其子定单。由于不知道要关联哪些行,因此必须添加一些代码来处理这一问题。可以在WITH子句中使用@mp:id/@mp:parentid元属性来提供一种获取父定单的新OrderID并将其映射到其子定单的OrderID字段的方法。
- ››如何检查oracle的归档空间是否满了
- ››如何在浏览器中打开PDF文件并实现预览的思路与代码...
- ››如何改Win7系统我的文档保存位置
- ››SQL Server 2008 R2 下如何清理数据库日志文件
- ››如何让ios app支持32位和64位
- ››如何删除Windows 8系统未知的账户
- ››如何提高win7系统的响应速度?
- ››sqlite 存取中文的解决方法
- ››SQL2005、2008、2000 清空删除日志
- ››如何避免iPhone应用中内存泄露
- ››如何转移Win 7系统C盘的用户文件夹
- ››SQL Server 2005和SQL Server 2000数据的相互导入...
更多精彩
赞助商链接