我熟悉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
答案 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
该资源提供了一些示例和一个步骤,所以希望应该有所帮助。