我正在尝试在SQL中编写一个存储过程:
从table1创建一个将返回多个值的select查询 在table2中插入新值(对于table1上的select返回的每条记录,table2中有1条新记录)。
我会在C#中使用foreach,但我知道SQL不会那样工作。这样做的正确方法是什么?
谢谢!
答案 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”。对于您遇到的极少数情况,请查看cursors和while-loop。语法非常尴尬,如果可以的话,你会自动避免使用它们:)
对于你的插入,这样的事情应该做:
INSERT INTO table2 (name, id)
SELECT name, id FROM table1
(为完整而复制)