2012-06-28 69 views
0

我想創建一個表,在這幾個記錄,然後運行一組SQL語句在該表中的每個記錄。我會使用表中的數據來設置sql語句中的值。執行SQL語句,而循環表

這應該讓我寫的SQL只有一次,然後運行它,我把任何表中的數據。

但是,我不知道如何去做這件事。我應該使用遊標來循環表格嗎?其他方式?

感謝您的任何幫助或建議,可以給我。

+0

是的,'CURSOR'可以工作。但是,這是否是最好的解決方案取決於你在循環內究竟做些什麼(你可能不需要它)。 – bfavaretto

+0

什麼數據庫?這聽起來更像是存儲過程的工作。 – Tawnos

+0

@bfavaretto我將放入幾個INSERT語句來填充一系列表。 – WilliamB2

回答

1

CURSOR將具有與其相關的開銷,但可以通過你的表走的好方法。他們不是一個完全不必要的邪惡,並有自己的位置。

隨着WilliamB2提供的信息有限,這聽起來像一個光標設定可能是這個問題,通過他的數據走併產生多個下游插入一個很好的解決方案。

0

是的,你可以使用遊標。你也可以使用while循環

declare @table as table(col1 int, col2 varchar(20)) 

declare @col1 int 
declare @col2 varchar(50) 

declare @sql varchar(max) 

insert into @table 
SELECT col1, col2 FROM OriginalTable 

while(exists(select top 1 'x' from @table)) --as long as @table contains records continue 
begin 
    select top 1 @col1=col1, @col2=col2 from @table 

    SET @sql = 'INSERT INTO Table t VALUES('+cast(@col1 as varchar)+')' 


    delete top (1) from @table --remove the previously processed row. also ensures no infinite loop 
end 

我認爲光標有一個附加在它上面的開銷。

隨着你是不是在原來的表工作第二種方法

+0

請注意,在'SET @sql ='行,您需要針對數據庫執行這些語句,或者以某種方式收集它們以供稍後執行。 另請注意,您在內存中複製了您的OriginalTable,這會導致一些內存開銷。 – Marshall

+1

是的,這是事實。但循環時表格不會被CURSOR鎖定。 – codingbiz

0

也許你可以使用INSERT...SELECT代替循環:

INSERT INTO target_table 
SELECT 
    some_col, 
    some_other_col, 
    'Some fixed value', 
    NULL, 
    42, 
    you_get_the_idea 
FROM source_table 
WHERE source_table.you_get_the_idea = 1 

列上你的SELECT應與目標表的結構(如果有的話,你可以省略一個int/identity pk,如id)。

如果最好的選擇是這樣的或循環取決於你想要多少表的循環內填充。如果只是少數,我通常堅持INSERT...SELECT

+0

我實際上並沒有將我的源表中的數據插入到我的目標表中。我使用源表中的字段在我的INSERT語句中設置參數來填充其他表。例如,如果我的源表是關於不同類型的水果的所有信息,並且我正在使用它來將一堆有關水果的統計信息插入到另一個表中。 – WilliamB2