2009-11-05 82 views
0

如果我傳遞一個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

回答

1

如果您可以將代碼從存儲過程移動到C#,則可以使用XMLBulkLoad,該代碼用於快速處理大文件。

您也可以嘗試在沒有INSERT的情況下運行查詢並測量性能差異。 XML解析不是限制因素很有可能。

+0

時間可能主要用於解析大型XML文件。可以測試批量上傳方法 – Eralper 2015-05-22 05:19:31

2

僅僅因爲你的源代碼不包含任何循環語法並不意味着沒有迭代發生。如果你的代碼插入10行到表中,它總是比插入1行要長10倍。

0

,因爲我沒有兩個數據比較,我只能建議額外的批量上傳方法,您可以在您的環境中測試你的數據

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