只是为了开发光标的东西。确实是很糟糕。它锁定整个表,然后一一处理行。
最好使用while循环以游标的形式遍历行
在while循环中,将对循环中的每一行执行一次选择,并且锁定一次仅发生在一行上。表中的其余数据可自由查询,从而减少了发生死锁的机会。
再加上它更快。让您想知道为什么仍然存在游标。
这是这种结构的示例:
DECLARE @LastID INT = (SELECT MAX(ID) FROM Tbl)
DECLARE @ID INT = (SELECT MIN(ID) FROM Tbl)
WHILE @ID <= @LastID
BEGIN
IF EXISTS (SELECT * FROM Tbl WHERE ID = @ID)
BEGIN
-- Do something to this row of the table
END
SET @ID += 1 -- Don't forget this part!
END
如果您的ID字段稀疏,则可能需要提取一个单独的ID列表并进行迭代:
DECLARE @IDs TABLE
(
Seq INT NOT NULL IDENTITY PRIMARY KEY,
ID INT NOT NULL
)
INSERT INTO @IDs (ID)
SELECT ID
FROM Tbl
WHERE 1=1 -- Criteria here
DECLARE @Rec INT = 1
DECLARE @NumRecs INT = (SELECT MAX(Seq) FROM @IDs)
DECLARE @ID INT
WHILE @Rec <= @NumRecs
BEGIN
SET @ID = (SELECT ID FROM @IDs WHERE Seq = @Seq)
-- Do something to this row of the table
SET @Seq += 1 -- Don't forget this part!
END