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”。我如何应用这个逻辑?
答案 0 :(得分:0)
虽然我的帖子不是直接答案OP同时尝试使用while并选择top 1(基于设置的循环)以避免光标(逐行)(如标题&#34中所示;没有光标" ),但为这样的问题提供其他解决方案。
在循环中选择前1并不会有助于提高性能,因为选择前1个导致表扫描,逻辑读取2-3个表中的每一行(我在northwind中使用customer表来测量逻辑读取) ,设置统计数据)
如果我们使用 FAST FORWARD CURSORS ,它将导致每行1次逻辑读取,这比选择top 1更好,并且避免了复合键和order by的复杂性,特别是在存储过程执行时。