在SQL Server 2008中使用OPENXML存储过程 – INSERT命令与XML文档不同

前端之家收集整理的这篇文章主要介绍了在SQL Server 2008中使用OPENXML存储过程 – INSERT命令与XML文档不同前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_1@我正在使用sql Server 2008的 XML解析功能来迭代 XML文档并执行INSERT每个元素.

但是,我的存储过程似乎是按照与文档中的顺序不同的顺序将每个元素插入到表中.

此外,我尝试这次的次数越多,INSERT顺序似乎就会发生变化.

这是XML文档的一个示例 – 没有什么太花哨的了.

  1. <ts>
  2. <t id="36a3c8c1-b958-42f0-82d1-dfa6bf9b99a1" encryptedAccountId="fQ/XF8lpeR9wEDUV3yMzvQ==" uploaded="2012-04-03T15:49:19.9615097Z" visible="1">
  3. <tv fieldId="301" officialValue="0,0" friendlyValue="0,0" />
  4. <tv fieldId="302" officialValue="0,1" friendlyValue="0,1" />
  5. <tv fieldId="303" officialValue="0,2" friendlyValue="0,2" />
  6. <tv fieldId="304" officialValue="0,3" friendlyValue="0,3" />
  7. <tv fieldId="305" officialValue="0,4" friendlyValue="0,4" />
  8. <tv fieldId="306" officialValue="0,5" friendlyValue="0,5" />
  9. </t>
  10. <t id="9d56d082-4b6a-4bdf-a7a2-f5c6af88344e" encryptedAccountId="fQ/XF8lpeR9wEDUV3yMzvQ==" uploaded="2012-04-03T15:49:19.9615097Z" visible="1">
  11. <tv fieldId="301" officialValue="1,0" friendlyValue="1,0" />
  12. <tv fieldId="302" officialValue="1,1" friendlyValue="1,1" />
  13. <tv fieldId="303" officialValue="1,2" friendlyValue="1,2" />
  14. <tv fieldId="304" officialValue="1,3" friendlyValue="1,3" />
  15. <tv fieldId="305" officialValue="1,4" friendlyValue="1,4" />
  16. <tv fieldId="306" officialValue="1,5" friendlyValue="1,5" />
  17. </t>
  18. <t id="27db47a3-ad3f-4279-8f4f-0a8944ce32d4" encryptedAccountId="fQ/XF8lpeR9wEDUV3yMzvQ==" uploaded="2012-04-03T15:49:19.9615097Z" visible="1">
  19. <tv fieldId="301" officialValue="2,0" friendlyValue="2,0" />
  20. <tv fieldId="302" officialValue="2,1" friendlyValue="2,1" />
  21. <tv fieldId="303" officialValue="2,2" friendlyValue="2,2" />
  22. <tv fieldId="304" officialValue="2,3" friendlyValue="2,3" />
  23. <tv fieldId="305" officialValue="2,4" friendlyValue="2,4" />
  24. <tv fieldId="306" officialValue="2,5" friendlyValue="2,5" />
  25. </t>
  26. <t id="867ea26b-0341-4d60-ac48-f305492a60f0" encryptedAccountId="fQ/XF8lpeR9wEDUV3yMzvQ==" uploaded="2012-04-03T15:49:19.9615097Z" visible="1">
  27. <tv fieldId="301" officialValue="3,0" friendlyValue="3,0" />
  28. <tv fieldId="302" officialValue="3,1" friendlyValue="3,1" />
  29. <tv fieldId="303" officialValue="3,2" friendlyValue="3,2" />
  30. <tv fieldId="304" officialValue="3,3" friendlyValue="3,3" />
  31. <tv fieldId="305" officialValue="3,4" friendlyValue="3,4" />
  32. <tv fieldId="306" officialValue="3,5" friendlyValue="3,5" />
  33. </t>
  34. </ts>

存储过程发生了一些操作,但我已经注释掉其他部分,只留下插入< t />的sql.元素,然后< tv />元素.

存储过程中的sql如下所示.

(@xmlTransaction是包含上述XML的NVARCHAR(MAX)输入参数)

  1. BEGIN
  2. SET NOCOUNT ON;
  3.  
  4. DECLARE @encryptedAccountID AS VARCHAR(200)
  5.  
  6. BEGIN TRANSACTION
  7. BEGIN TRY
  8. DECLARE @Handle AS INT
  9. DECLARE @TransactionCount AS INT
  10.  
  11. EXEC sp_xml_preparedocument @Handle OUTPUT,@xmlTransaction
  12.  
  13. /* encryptedAccountId is always the same for each @xmlTransaction param */
  14. /* Just take the value from the first <t/> element */
  15. SET @encryptedAccountID = (SELECT eID FROM OPENXML (@Handle,'/ts/t[1]',2) WITH ( eID VARCHAR '@encryptedAccountId' ))
  16.  
  17. /* Go through each <t/> element in the XML document and INSERT */
  18. INSERT INTO
  19. [Transactions]
  20. (
  21. [ID],[EncryptedAccountID]
  22. )
  23. SELECT
  24. *
  25. FROM
  26. OPENXML (@Handle,'/ts/t',2)
  27. WITH
  28. (
  29. rID UNIQUEIDENTIFIER '@id',rEncryptedAccountID VARCHAR (200) '@encryptedAccountId'
  30. )
  31.  
  32. /* Loop through each TransactionValue in the XML document and INSERT */
  33. INSERT INTO
  34. [TransactionValues]
  35. (
  36. FieldID,TransactionID,OfficialValue,FriendlyValue
  37. )
  38. SELECT
  39. *
  40. FROM
  41. OPENXML (@Handle,'/ts/t/tv',2)
  42. WITH
  43. (
  44. rFieldID INT '@fieldId',rTransactionID UNIQUEIDENTIFIER '../@id',rOfficialValue NVARCHAR (500) '@officialValue',rFriendlyValue NVARCHAR (500) '@friendlyValue'
  45. )
  46.  
  47. /* Dispose of the XML document */
  48. EXEC sp_xml_removedocument @Handle
  49.  
  50. COMMIT TRANSACTION
  51. END TRY
  52. BEGIN CATCH
  53.  
  54. RETURN @@ERROR
  55.  
  56. ROLLBACK TRANSACTION
  57. END CATCH
  58.  
  59. END

应该相当简单.然而,如果我查询结果,它们与XML文档的顺序不同. < tv />的第二个INSERT语句元素确实以正确的顺序将元素存储到第二个表中,但< t />元素不以正确的顺序存储在其表中.

任何人都可以向我解释为什么< t />元素是否以与XML文档中出现的顺序相同的顺序插入到表中?

解决方法

如果我在sql Server中使用本机XQuery支持而不是“遗留”OPENXML内容,那么看起来< t>节点确实按照它们出现在XML文档中的顺序插入到表中.

我使用过这样的代码

  1. INSERT INTO dbo.[Transactions]([ID],[EncryptedAccountID])
  2. SELECT
  3. XT.value('@id','uniqueidentifier'),XT.value('@encryptedAccountId','varchar(200)')
  4. FROM
  5. @xmlTransaction.nodes('/ts/t') AS Nodes(XT)

对于< tv>也可以这样做.子节点也是.

猜你在找的MsSQL相关文章