循环表时执行SQL语句

时间:2012-06-28 03:26:41

标签: sql sql-server

我想创建一个包含几条记录的表,然后为该表中的每条记录运行一组sql语句。我会使用表中的数据来设置sql语句中的值。

这应该允许我只编写一次SQL,然后运行它以获取我放在表中的任何数据。

但是,我不知道该怎么做。我应该使用游标来循环表吗?其他一些方式?

感谢您提供任何帮助或建议。

3 个答案:

答案 0 :(得分:1)

CURSOR会产生与之相关的开销,但这可能是一种很好的方法来遍历你的桌子。他们不是一个完全不必要的邪恶并且有他们的位置。

由于WilliamB2提供的信息有限,听起来像CURSOR集可能是解决这个问题的好方法,可以遍历他的数据并生成多个下游INSERT。

答案 1 :(得分: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 

我认为游标附加了一个开销。

使用第二种方法,您不会处理原始表

答案 2 :(得分: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上的列应该与目标表的结构相匹配(如果有的话,可以省略id之类的int / identity pk。)

如果最佳选项是这个,或者循环取决于您想要在循环内填充多少个表。如果只是少数,我通常会坚持使用INSERT...SELECT