2015-07-06 68 views
1

我有一個存儲過程,我在其中處理(在數據庫上選擇)。衆多插入存儲過程

根據請求的結果,我在數據庫的一行中插入一些相應的數據。 我做這個過程數千次(有一段時間)。

SET @i = 0 
WHILE (@i <= (SELECT MAX(Id) FROM @Metadata)) 
    BEGIN 
     ..... 

     INSERT INTO [MyTable] (Field1, Field2,Field3...) VALUES (VALUE1, VALUE3, VALUE3 ...) 
     SET @i = @i + 1 
    END 

如果我看的表演,是它更好地做到這樣或存儲我在臨時表(在while循環)的結果,然後從這個臨時表中只能做一個插件?

有什麼更好的嗎?


我想補充一些資料,可能是我當時真不明白: - 在我的存儲過程的輸入我有一個估價表(其中有1000元和5000之間)。 - 對於這個表的每一行(while循環),我在我的數據庫上做了幾個SELECT(根據SELECT的結果,我給變量指定了某些值),這就是我插入到數據庫中的這些值插入我的表中的每一行後處理價值)。

+1

剛出於好奇,數據從哪裏來? – Jeremy

+0

如果您要堅持使用while循環(而不是集合),作爲快速優化,您可以構建一個插入批次行的命令。因此,您的命令將使用INSERT INTO ...進行初始化,並且您會在循環的每次迭代中附加一組VALUES。然後執行該命令。重複大塊直至完成。 – dave

+0

感謝您的回答。我添加了一些信息,以便更清楚。我不堅持一段時間循環,但我不知道如何做不同。 – Fabaud

回答

0

您可以使用tally tablecross join來做到這一點。

WITH lv0 AS (SELECT 0 g UNION ALL SELECT 0) 
    ,lv1 AS (SELECT 0 g FROM lv0 a CROSS JOIN lv0 b) -- 4 
    ,lv2 AS (SELECT 0 g FROM lv1 a CROSS JOIN lv1 b) -- 16 
    ,lv3 AS (SELECT 0 g FROM lv2 a CROSS JOIN lv2 b) -- 256 
    ,lv4 AS (SELECT 0 g FROM lv3 a CROSS JOIN lv3 b) -- 65,536 
    ,lv5 AS (SELECT 0 g FROM lv4 a CROSS JOIN lv4 b) -- 4,294,967,296 
    ,Tally (n) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM lv5) 
SELECT VALUE1, 
     VALUE3, 
     VALUE3,... 
FROM your_source_table 
     CROSS JOIN Tally 
WHERE n < = (SELECT Max(Id) 
       FROM @Metadata) 
+0

感謝您的回答。我添加了一些信息以確保我很清楚。我不知道我是否可以使用統計表,因爲在插入之前我有幾個處理,但可能是我沒有正確理解你的答案。 – Fabaud