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有很好的文档记录,您应该从这里开始: