在SQL中使用什么而不是“Foreach”循环

时间:2009-07-09 19:41:25

标签: sql stored-procedures

我正在尝试在SQL中编写一个存储过程:

从table1创建一个将返回多个值的select查询 在table2中插入新值(对于table1上的select返回的每条记录,table2中有1条新记录)。

我会在C#中使用foreach,但我知道SQL不会那样工作。这样做的正确方法是什么?

谢谢!

5 个答案:

答案 0 :(得分:9)

INSERT INTO tabl2 (name, id)
   SELECT name, id FROM table1

修改

我应该补充一点,循环在SQL中确实非常有用,所以你可能也想知道如何做到这一点。这是一个例子:

DECLARE @temp TABLE (ix int identity(1,1), id int, name varchar(100))

INSERT INTO @temp SELECT id, name FROM table1

DECLARE @i int, @max int

SELECT
   @i = 0
   @max = MAX(ix)
FROM
   @temp

WHILE @i < @max
BEGIN
   SET @i = @i + 1

   -- LOGIC HERE...

END

答案 1 :(得分:2)

SQL是一种基于集合的语言。你所做的是将你想要的结果表达为一个查询 - 返回一个'set'然后插入到新表中。

你可以使用基于行的CURSOR,但这确实是最后的选择。我很少发现这是唯一的方法。

也许如果您发布了关于您的问题的详细信息,我们可以提供帮助!

答案 2 :(得分:2)

你想要的是一个插入/选择语句,而不是每个语句。如果您发现自己需要迭代行来执行某些操作,那么您应该考虑“如何在基于集合的解决方案中实现相同的功能”。在SQL中工作时没有考虑基于集合可能会导致您很快陷入性能问题的路径。

INSERT Table2
       (Col1,
        Col2)
SELECT T1Col1,
       T1Col2
FROM   Table1
WHERE  T1Col2 = 'whatever'

答案 3 :(得分:1)

您可以使用select作为插入值

INSERT INTO Table1
(
    FieldA,
    FieldB
)
SELECT
    FieldA,
    FieldB
FROM Table2

答案 4 :(得分:1)

在这种情况下不需要“foreach”。对于您遇到的极少数情况,请查看cursorswhile-loop。语法非常尴尬,如果可以的话,你会自动避免使用它们:)

对于你的插入,这样的事情应该做:

INSERT INTO table2 (name, id)
   SELECT name, id FROM table1

(为完整而复制)