【问题标题】:How can I return a sql select into a sql variable如何将 sql 选择返回到 sql 变量中
【发布时间】:2011-02-14 20:58:06
【问题描述】:

我正在尝试将 SELECT 的结果放入一个变量中并循环遍历结果以操作该数据,所有这些都在同一个存储过程中......这是我目前所拥有的:

DECLARE @i int

@Result = (SELECT * FROM UserImport)

SET @i = 0
WHILE @i < (SELECT Count(@Result) As Count)
BEGIN
   /* Do Stuff */
END

我知道我离题了,因为它说 @Result 未声明,但我不确定如何声明一个变量以保存 SELECT 语句的结果。

谁能告诉我哪里出了问题以及如何解决?

谢谢,
马特

【问题讨论】:

  • 你能详细说明你想在 /* Do Stuff */ 中发生的事情吗?可能有更好的解决方案。

标签: sql sql-server select variables while-loop


【解决方案1】:

考虑使用表变量而不是游标

http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=529

当然,您应该始终支持基于集合的操作,而不是任何这些操作。 SQL 专为基于集合的操作而设计。

【讨论】:

【解决方案2】:

您可以使用光标,至少这是传统的做法。您还可以根据要求使用 while 循环。有关光标和替代方法的示例,请参阅本文。

Avoiding SQL cursors

【讨论】:

    【解决方案3】:

    与其考虑循环结果,不如仔细研究“做事”部分,看看您是否可以一步完成所有操作,而无需循环或光标。

    如果可以,请发布有关您需要做的实际工作的更多详细信息,可能不需要光标。

    【讨论】:

      【解决方案4】:

      循环是破坏数据库性能的最糟糕方法之一!

      我建议您尝试在单个命令中处理 select 语句,如下所示:

      UPDATE t2
          SET Cola=t1.col1, Colb=t1.col2
          FROM UserInput t1
          JOIN YourTable t2 ON t1.id=t2.id
      

      但是如果你必须循环这样做:

      DECLARE @Current int, @LastRow int
      DECLARE @Col1 datatype, @Col2 datatype ....
      DECLARE @Results  table (RowId int identity1,1) primary key, col1 ...,col2 ...)
      
      INSERT INTO @Results SELECT * FROM UserImport
      SELECT @Current=0, @LastRow=@@ROWCOUNT
      
      WHILE @Current<@LastRow
      BEGIN
          SET @Current=@Current+1
          SELECT @Col1=Col1, @Col2=col2 FROM @Results WHERE RowId=@Current
      
         /* Do Stuff */
      
      END
      

      如果您处理的行数超过 100 行,请将表变量:@Results 替换为临时表:#Results,例如:

      CREATE TABLE #RESULTS (RowId int identity1,1) primary key, col1 ...,col2 ...)
      

      因为这样会更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-26
        • 1970-01-01
        • 2018-09-03
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 2013-05-05
        • 1970-01-01
        相关资源
        最近更新 更多