【问题标题】:Loop through table by row T-SQL逐行遍历表 T-SQL
【发布时间】:2016-04-15 08:13:16
【问题描述】:

在 T-SQL 中,我想通过逐行读取来遍历存储过程中的表。

DECLARE @IMAX INT,
        @ICOUNT INT,
        @INTERFACE_ID_36 INT,
        @INTERFACE_ID_38 INT

SELECT * FROM INTERFACE_36_DATA

SET @IMAX = @@ROWCOUNT
SET @ICOUNT = 1

WHILE(@ICOUNT <= @IMAX)
    BEGIN
        SELECT @INTERFACE_ID_36 = Interface_ID
        FROM INTERFACE_36_DATA
        WHERE ROW_NUMBER() OVER (ORDER BY id) AS  = @ICOUNT   --syntax error here

            IF @INTERFACE_ID_36 = 10
                SET @INTERFACE_ID_38 = 0
            ELSE IF @INTERFACE_ID_36 = 

【问题讨论】:

  • 那么问题/问题/查询是什么? - 你也可以使用 While 循环和光标。
  • 在 T-SQL 中,一般规则是:尽量避免 RBAR (row-by-agonizing-row) 处理。使用基于集合的“本机”SQL操作——更简单、更快

标签: sql-server tsql


【解决方案1】:

我建议使用 Cursors 更快地重写它:

DECLARE @IMAX INT,
        @ICOUNT INT,
        @INTERFACE_ID_36 INT,
        @INTERFACE_ID_38 INT

DECLARE db_cursor CURSOR FOR  
SELECT Interface_ID FROM INTERFACE_36_DATA  

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @INTERFACE_ID_36   

WHILE @@FETCH_STATUS = 0   
BEGIN
       SELECT @INTERFACE_ID_36
       -- All your other selects  

       FETCH NEXT FROM db_cursor INTO @INTERFACE_ID_36   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

【讨论】:

    【解决方案2】:

    如下所示更改您的查询。 因为我们不能在 where 条件下使用 row_number。 Check the link here for more descr

    WITH    cte
              AS ( SELECT   Interface_ID ,
                            ROW_NUMBER() OVER ( ORDER BY id ) AS RN
                   FROM     INTERFACE_36_DATA
                 )
        SELECT  @INTERFACE_ID_36 = Interface_ID
        FROM    cte
        WHERE   RN = @ICOUNT
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      DECLARE @IMAX INT,
              @ICOUNT INT,
              @INTERFACE_ID_36 INT,
              @INTERFACE_ID_38 INT
      select *,ROW_NUMBER() OVER (ORDER BY Interface_ID) RowId  into #tmptbl from INTERFACE_36_DATA
      
      Declare @I BIGINT = 1    
      declare @count BIGINT = (select Count(*)  from #tmptbl)    
      while(@I < = @count)    
        begin  
      
              SELECT @INTERFACE_ID_36 = Interface_ID
              FROM #tmptbl
              where   RowId = @I
      
              --- do yor additional stuff
         set @I =@I +1    
        end    
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 2013-12-05
        • 2010-12-07
        相关资源
        最近更新 更多