逐行遍历表 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的主要内容,如果未能解决你的问题,请参考以下文章