NULL AS [OrderDetail!2!OrderDetailId], NULL AS [OrderDetail!2!OrderId], NULL AS [OrderDetail!2!ItemId], NULL AS [OrderDetail!2!UnitPrice], NULL AS [OrderDetail!2!Quantity] from Orders UNION ALL
/* 订单详细信息是子 XML 元素 */ select 2 as tag, 1 as parent, Orders.OrderId AS [Order!1!OrderId], NULL AS [Order!1!OrderStatus], NULL AS [Order!1!OrderDate], NULL AS [Order!1!SubTotal], NULL AS [Order!1!Tax], NULL AS [Order!1!ShippingHandling], NULL AS [Order!1!ShipToName], NULL AS [Order!1!ShipToAddressId], OrderDetails.OrderDetailId AS [OrderDetail!2!OrderDetailId], OrderDetails.OrderId AS [OrderDetail!2!OrderId], OrderDetails.ItemId AS [OrderDetail!2!ItemId], OrderDetails.UnitPrice AS [OrderDetail!2!UnitPrice], OrderDetails.Quantity AS [OrderDetail!2!Quantity] from Orders, OrderDetails where Orders.OrderId = OrderDetails.OrderId ORDER BY [Order!1!OrderId],[OrderDetail!2!OrderDetailId] For XML EXPLICIT
Create Procedure InsertOrder @Order NVARCHAR(4000) = NULL, @OrderId int Output - DECLARE @hDoc INT DECLARE @PKId INT BEGIN TRANSACTION /* 将 XML 载入文档以进行分析 */ EXEC sp_xml_preparedocument @hDoc OUTPUT, @Order /* 插入订单标头 */ INSERT Orders(CustomerId, OrderDate, ShipToName, ShipToAddressId, OrderStatus) SELECT * FROM OPENXML(@hDoc, '/NewDataSet/Orders') WITH ( CustomerId int 'CustomerId', OrderDate Datetime 'OrderDate', ShipToName nvarchar(40) 'ShipToName', ShipToAddressId int 'ShipToAddressId', OrderStatus int 'OrderStatus') SELECT @PKId = @@IDENTITY /* 插入订单详细信息 */ INSERT OrderDetails (OrderId, ItemId, UnitPrice, Quantity) SELECT @PKId as OrderId, ItemId, UnitPrice, Quantity FROM OPENXML(@hDoc, '/NewDataSet/Details') WITH ( ItemId int 'ItemId', UnitPrice money 'UnitPrice', Quantity int 'Quantity') /* 指定输出参数的值 */ Select @OrderId = @PKId COMMIT TRANSACTION /* 清除 XML 文档 */ EXEC sp_xml_removedocument @hDoc
总结
本文以及附带的示例介绍了有关数据转换的信息。通过数据转换,可以使用 SQL Server 2000 的 XML 功能将现有 Transact SQL 代码作为 Web 服务提供。本文集中讨论了传入和传出 Transact SQL 代码的数据与 SOAP 消息(在 Web 服务客户机和服务器之间使用)之间的转换。