我想创建一个包含几条记录的表,然后为该表中的每条记录运行一组sql语句。我会使用表中的数据来设置sql语句中的值。
这应该允许我只编写一次SQL,然后运行它以获取我放在表中的任何数据。
但是,我不知道该怎么做。我应该使用游标来循环表吗?其他一些方式?
感谢您提供任何帮助或建议。
答案 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
。