【问题标题】:What to use in SQL instead of a "Foreach" loop在 SQL 中使用什么而不是“Foreach”循环
【发布时间】:2010-11-09 12:20:37
【问题描述】:

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

从 table1 进行选择查询,该查询将返回多个值 在 table2 中插入新值(table2 中的 1 个新记录,用于 table1 上的 select 返回的每条记录)。

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

谢谢!

【问题讨论】:

标签: sql stored-procedures


【解决方案1】:
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

【讨论】:

  • 不错,但不推荐用于大型数据集。在这种情况下,最好使用只进游标......即使它会产生丑陋的代码。
【解决方案2】:

SQL 是一种基于集合的语言。您所做的是将您想要的结果表达为查询 - 返回一个“集合”,然后将其插入新表中。

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

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

【讨论】:

  • 使用游标是最后的手段,因为 MS SQL 的执行速度慢还是有其他原因?
  • 不,因为如果您在早期考虑游标,那么您可能一开始就没有以正确的方式考虑问题。仅仅因为你有一个工具,并不能使它成为正确的工具。
  • 汉斯,用于遍历记录的游标通常比基于集合的解决方案慢得多,尤其是在 SQl Server 中。数据库经过优化,可以在一次不是一行的集合中工作,因此如果您找不到满足需要的基于集合的解决方案,您应该只考虑逐行解决方案(游标、相关子查询等)。速度差异可能不会对小型数据集产生影响,但首先寻找基于集合的解决方案的心态会提高整个应用程序的性能。一旦你习惯了它们,基于集合的解决方案比游标更容易编写。
  • HLGEM 做到了——一旦你在系列中思考,事情确实变得更容易并且表现更好。
【解决方案3】:

你想要的是一个插入/选择语句,而不是一个 for each。如果您发现自己需要遍历行来做某事,您应该考虑“我怎样才能在基于集合的解决方案中完成同样的事情”。在 SQL 中工作时不考虑基于集合的思维方式可能会导致您很快陷入性能问题。

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

【讨论】:

    【解决方案4】:

    您可以使用选择作为插入的值

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

    【讨论】:

      【解决方案5】:

      在这种情况下不需要“foreach”。对于您所做的极少数情况,请查看cursorswhile-loop。语法太笨拙了,如果可以的话,您会自动避免使用它们:)

      对于您的插入,应该这样做:

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

      (为完整起见复制)

      【讨论】:

      • 是的.. 有时游标可能是邪恶的。您也可以使用 while 进行循环。 msdn.microsoft.com/en-us/library/ms178642(SQL.90).aspx
      • 感谢 while-loop 链接。您将需要它来使用游标读取结果集:)
      • 在某些情况下,游标可能比 while 循环更快,而在其他情况下,while 循环可能更快,您需要在特定情况下进行测试。在几乎所有情况下(运行总计除外),基于集合的解决方案都比任何一种解决方案都快,通常快很多。通过从光标更改为基于集合的解决方案,我将事情从超过 24 小时缩短到大约 40 分钟,从 40 多分钟缩短到 45 秒。从 while 循环到基于集合的解决方案也会发生类似的改进。
      猜你喜欢
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 2018-01-08
      • 2011-04-21
      相关资源
      最近更新 更多