逐行遍历表 T-SQL

Posted

技术标签:

【中文标题】逐行遍历表 T-SQL【英文标题】:Loop through table by row 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操作——更简单、更快 【参考方案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    

【讨论】:

以上是关于逐行遍历表 T-SQL的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL for 循环遍历列名并插入

使用 T-SQL 根据先前行的值逐行更新表

jquery 逐行遍历table

ruby逐行遍历文件

T-SQL:循环遍历一组已知值

逐行遍历变量。