每行不使用复合键中的光标

时间:2016-07-28 21:59:59

标签: sql-server tsql

    DECLARE @CustomerID INT = 0

    -- Iterate over all customers
    WHILE (1 = 1) 
    BEGIN  

    -- Get next customerId
    SELECT TOP 1 @CustomerID = CustomerID
    FROM Sales.Customer
    WHERE CustomerID > @CustomerId 
   ORDER BY CustomerID

  - - Exit loop if no more customers
   IF @@ROWCOUNT = 0 BREAK;

 -- call your sproc
    EXEC dbo.YOURSPROC @CustomerId

END

当我的表有复合键时,如何使用此代码..我没有单个主键。我有复合“AppID”和“OriginID”。我如何应用这个逻辑?

1 个答案:

答案 0 :(得分:0)

虽然我的帖子不是直接答案OP同时尝试使用while并选择top 1(基于设置的循环)以避免光标(逐行)(如标题&#34中所示;没有光标" ),但为这样的问题提供其他解决方案。

在循环中选择前1并不会有助于提高性能,因为选择前1个导致表扫描,逻辑读取2-3个表中的每一行(我在northwind中使用customer表来测量逻辑读取) ,设置统计数据)

如果我们使用 FAST FORWARD CURSORS ,它将导致每行1次逻辑读取,这比选择top 1更好,并且避免了复合键和order by的复杂性,特别是在存储过程执行时。