2012-06-28 70 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