在T-SQL中,当迭代游标的结果时,在FETCH循环之前重复WHILE语句似乎是一种惯例。下面的示例来自Microsoft:

DECLARE Employee_Cursor CURSOR FOR
SELECT EmployeeID, Title FROM AdventureWorks2012.HumanResources.Employee
    WHERE JobTitle = 'Marketing Specialist';
OPEN Employee_Cursor;

FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
    BEGIN
        FETCH NEXT FROM Employee_Cursor;
    END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO

(注意FETCH NEXT FROM Employee_Cursor;如何出现两次。)

如果FETCH选择了很长的变量列表,那么我们将有一个很大的重复语句,这很丑陋,当然还有“non-DRY”代码。

我不知道后置条件流控制T-SQL语句,因此似乎我必须不得不求助于WHILE(TRUE),然后在BREAK不为零时求助于@@FETCH_STATUS。我觉得这很笨拙。

我还有什么其他选择?

最佳答案

简而言之,您不能...这就是SQL中大多数where语句的工作方式。您需要在循环之前获取第一行,然后在while语句中再次执行。

更好的问题是如何摆脱游标,并尝试在没有游标的情况下解决您的查询。

关于sql - 使用游标时,如何避免在T-SQL中复制FETCH?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12261566/

10-13 09:31