Sql server 无限循环时的T-SQL

Sql server 无限循环时的T-SQL,sql-server,tsql,Sql Server,Tsql,下面脚本的目标是删除表中所有不同用户的所有记录,每个用户的前两条记录除外 问题是脚本在这两行之间进入了一个无限循环 WHILE @@FETCH_STATUS = 0 SET @Event = 0; 完整的脚本是 DECLARE @Event int, @User int; DECLARE cUsers CURSOR STATIC LOCAL FOR SELECT DISTINCT(UserID) FROM Identifications; OPEN cUsers FETCH NEXT F

下面脚本的目标是删除表中所有不同用户的所有记录,每个用户的前两条记录除外

问题是脚本在这两行之间进入了一个无限循环

WHILE @@FETCH_STATUS = 0
SET @Event = 0;
完整的脚本是

DECLARE @Event int, @User int;

DECLARE cUsers CURSOR STATIC LOCAL FOR SELECT DISTINCT(UserID) FROM Identifications;

OPEN cUsers

FETCH NEXT FROM cUsers INTO @User;

WHILE @@FETCH_STATUS = 0
SET @Event = 0;

BEGIN
    DECLARE cRows CURSOR STATIC LOCAL FOR
    SELECT EventIdentificacionId FROM Identifications WHERE UserId = @User AND EventIdentificacionId NOT IN
     (SELECT TOP 2 EventIdentificacionId FROM Identifications WHERE UserId = @User ORDER BY EventIdentificacionId);

    OPEN cRows
    FETCH NEXT FROM cRows INTO @Event;

    WHILE @@FETCH_STATUS = 0
    BEGIN
      DELETE FROM Identifications WHERE EventIdentificacionId = @Event;
      FETCH NEXT FROM cRows INTO @Event;
    END

    CLOSE cRows;
    DEALLOCATE cRows;

    FETCH NEXT FROM cUsers INTO @User;
END

CLOSE cUsers;
DEALLOCATE cUsers;

有人能给我一些解决方案/解释吗?

更改此行,如图所示:

DECLARE @Event int = 0, @User int = 0;
然后拆下这条线

SET @Event = 0;
您拥有无限循环的原因是以下代码:

WHILE @@FETCH_STATUS = 0
SET @Event = 0;
BEGIN
实际上是这样的:

-- A loop of a single instruction, with no exit criteria
WHILE @@FETCH_STATUS = 0 SET @Event = 0;

-- begin a new code block, with no condition or loop
BEGIN

正如我在评论中所写的那样,有比使用游标更好的方法来实现这一点,更不用说使用两个嵌套游标了

一个更好的选择是使用公共表表达式和行号,然后直接从公共表表达式中删除行。
我不完全确定这段代码是否正确,因为我没有真正的方法来测试它,因为您没有提供示例数据或期望的结果,但我根据问题中的代码得出了这一结论:

;WITH CTE AS
(
    SELECT  UserId, 
            EventIdentificacionId,
            ROW_NUMBER() OVER(PARTITION BY UserId ORDER BY EventIdentificacionId) As Rn
    FROM Identifications
)

DELETE 
FROM CTE
WHERE Rn > 2 -- Delete all but the first two rows
很高兴为您提供帮助:-)T-SQL有很好的文档记录,您应该从这里开始: