代码之家  ›  专栏  ›  技术社区  ›  Matt

如何将sql select返回到sql变量中

  •  0
  • Matt  · 技术社区  · 16 年前

    我试着把 SELECT 在同一个存储过程中,将结果循环到一个变量中以操作这些数据…以下是我目前掌握的情况:

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

    我知道我走远了因为它在说 @Result 未声明,但我不确定如何声明变量以保存 选择 陈述。

    有人能告诉我哪里出了问题,怎么解决吗?

    谢谢,
    马特

    4 回复  |  直到 16 年前
        1
  •  2
  •   mdma    16 年前

    你可以使用光标,至少这是传统的方式。您也可以根据需要使用while循环。请参阅本文以获取游标和替代项的示例。

    Avoiding SQL cursors

        2
  •  1
  •   SqlACID    16 年前

    与其用循环的方式来思考结果,不如仔细看看“做事情”这一部分,看看你是否可以把所有的事情都作为一个步骤来完成,而不需要循环或光标。

    发布更多关于实际工作的详细信息如果可以的话,很可能不需要光标。

        3
  •  1
  •   Raj Kaimal    16 年前

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

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

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

        4
  •  0
  •   anonymous user    16 年前

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

    我建议您尝试在一个命令中处理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 ...)
    

    因为那样会更快。