转换XML到表中的SQL Server 2005

问题描述:

如果我传递一个XML参数的存储过程,看起来像这样:转换XML到表中的SQL Server 2005

<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的时间就会变得太长。

有没有更快的方法来达到上述目的?

+0

基于你的基准,'long'是'long'多长?迭代步骤隐式执行。我只能发表评论,因为我不知道如何使操作更快而不是提升硬件:P – 2009-11-05 11:07:02

+0

嗯,这里调用'FROM @ ClientKeys.nodes(.....)'基本上是对你的“ ck“节点 - 越多,你会得到越多的行。 – 2009-11-05 12:12:35

如果您可以将代码从存储过程移动到C#,则可以使用XMLBulkLoad,该代码用于快速处理大文件。

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

+0

时间可能主要用于解析大型XML文件。可以测试批量上传方法 – Eralper 2015-05-22 05:19:31

仅仅因为你的源代码不包含任何循环语法并不意味着没有迭代发生。如果你的代码插入10行到表中,它总是比插入1行要长10倍。

,因为我没有两个数据比较,我只能建议额外的批量上传方法,您可以在您的环境中测试你的数据

其中之一是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命令的其他选项。