【问题标题】:Convert XML to table in SQL Server 2005在 SQL Server 2005 中将 XML 转换为表
【发布时间】:2009-11-05 10:55:59
【问题描述】:

如果我将 xml 参数传递给如下所示的存储过程:

<ClientKeys>
   <ck>3052</ck>
   <ck>3051</ck>
   <ck>3050</ck>
   <ck>3049</ck>
   ...
 </ClientKeys>

...然后将 XML 转换为临时表,如下所示:

CREATE TABLE #ClientKeys ( ClientKey varchar(36) )  
INSERT INTO #ClientKeys (ClientKey) 
     SELECT ParamValues.ck.value('.','VARCHAR(36)')  
    FROM @ClientKeys.nodes('/ClientKeys/ck') as ParamValues(ck)   

...临时 tbl 已填充,一切都很好。然而,填充所述表所花费的时间与 xml 中“ck”元素的数量严格成正比——这是我没有预料到的,因为没有迭代步骤。因此,填充 tbl 所需的时间很快就会变得“太长”。

有没有更快的方法来实现上述目标?

【问题讨论】:

  • 根据您的基准,“长”有多长?迭代步骤被隐式执行。我只能发表评论,因为除了提升硬件之外,我不知道如何使操作更快:P
  • 好吧,这里的调用FROM @ClientKeys.nodes(.....) 基本上是对“ck”节点的迭代——节点越多,得到的行就越多。

标签: sql sql-server xml sql-server-2005


【解决方案1】:

仅仅因为您的源代码不包含任何循环语法并不意味着没有迭代发生。如果您的代码向表中插入 10 行,则它所花费的时间总是比插入 1 行长 10 倍。

【讨论】:

    【解决方案2】:

    如果您可以将代码从存储过程移动到 C#,您可以使用 XMLBulkLoad,它是为快速处理大文件而编写的。

    您也可以尝试在不使用 INSERT 的情况下运行查询并测量性能差异。 XML 解析很有可能不是限制因素。

    【讨论】:

    • 大部分时间可以花在解析大型 XML 文件上。可以测试批量上传方式
    【解决方案3】:

    由于我没有数据两个比较,我只能建议您可以使用您的数据在您的环境中测试的其他批量上传方法

    其中一个是upload XML using SQL OpenRowSet command

    DECLARE @X XML
    SELECT 
       @X = ck
    FROM OPENROWSET (BULK 'C:\kodyaz.com\sql\ClientKeys.xml', SINGLE_BLOB) AS Import(ck)
    
    Select
       [ClientKey].value('.','varchar(100)') AS ClientKey
    From @X.nodes('/ClientKeys/ck') keys([ClientKey])
    

    在同一资源上,还有另一个使用 OPENXML 命令的选项。

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2012-08-04
      • 2011-08-18
      • 2012-03-28
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多