将执行UPDATE的CURSOR转换为CTE

时间:2017-09-11 10:03:55

标签: sql-server tsql

我熟悉CURSORS,但没有CTE的经验,也从未真正使用它们,但有人告诉他们这是比CURSOR更好的选择

为了尝试理解CTE的逻辑,我写了以下CURSOR,希望转换为CTE。有人可以帮帮我吗?

DECLARE @CustomerID UNIQUEIDENTIFIER

DECLARE SalesOrderCursor CURSOR READ_ONLY
FOR
SELECT CustomerID FROM OrdersProcessed

OPEN SalesOrderCursor

FETCH NEXT FROM SalesOrderCursor INTO @CustomerID
WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE CustomerOrderStatus SET Shipped = 1 WHERE CustomerID = @CustomerID

    END

    FETCH NEXT FROM SalesOrderCursor INTO @CustomerID 
END 

3 个答案:

答案 0 :(得分:3)

我只想使用以下命令

UPDATE CustomerOrderStatus 
SET Shipped = 1 
WHERE CustomerID IN
(
    SELECT CustomerID FROM OrdersProcessed
)

答案 1 :(得分:2)

在这种情况下,您既不需要使用CURSOR也不使用CTE。

UPDATE s
  SET Shipped = 1 
FROM CustomerOrderStatus s
  JOIN OrdersProcessed o ON s.CustomerID = o.CustomerID 

答案 2 :(得分:0)

正如其他人提到的那样,你的例子中肯定不需要游标,所以如果你认为有,那么建议需要成为你的默认思维尽管游标是非常严峻的事情,他们的表现是通常很可怕,因此只应在必要时使用。

如果你只是以它为例,以及如何使用CTE来做同等的事情,那么:

;WITH CTE AS
(
    SELECT  OP.CustomerID 
    FROM    OrdersProcessed     AS OP
)
UPDATE      CO
SET         CO.Shipped          =   1
FROM        CustomerOrderStatus AS CO  
INNER JOIN  CTE                 AS  CT  ON  CT.CustomerID   =   CO.CustomerID;

在那里的示例中不需要递归,例如,其他答案比使用CTE要好得多。您通常会使用递归CTE替换游标:在此处阅读:https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

该资源提供了一些示例和一个步骤,所以希望应该有所帮助。