Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Sql Server游标无限循环_Sql Server_Tsql_Cursor - Fatal编程技术网

Sql server Sql Server游标无限循环

Sql server Sql Server游标无限循环,sql-server,tsql,cursor,Sql Server,Tsql,Cursor,可以用一条update语句替换整个游标逻辑。这应该做同样的事情 DECLARE @UnitPrice DECIMAL(5, 2); DECLARE @ProductId INT; DECLARE UnitPriceUpdateCursor CURSOR FOR SELECT ProductID FROM Products; OPEN UnitPriceUpdateCursor; FETCH NEXT FROM UnitPriceUpdateCursor INTO @Product

可以用一条update语句替换整个游标逻辑。这应该做同样的事情

DECLARE @UnitPrice DECIMAL(5, 2);
DECLARE @ProductId INT;
DECLARE UnitPriceUpdateCursor CURSOR
FOR
    SELECT ProductID
    FROM Products;
OPEN UnitPriceUpdateCursor;
FETCH NEXT FROM UnitPriceUpdateCursor INTO @ProductId;
WHILE(@@Fetch_Status = 0)
    BEGIN
        SELECT @UnitPrice = UnitPrice
        FROM Products;
        IF(@UnitPrice BETWEEN 5 AND 10)
            BEGIN
                UPDATE Products
                  SET
                      UnitPrice = 15.00
                WHERE ProductID = @ProductId;
        END;
            ELSE
        IF(@UnitPrice BETWEEN 15 AND 20)
            BEGIN
                UPDATE Products
                  SET
                      UnitPrice = 25
                WHERE ProductID = @ProductId;
        END;
        FETCH NEXT FROM UnitPriceUpdateCursor INTO @ProductId;
    END;
CLOSE UnitPriceUpdateCursor;
DEALLOCATE UnitPriceUpdateCursor;
SET NOCOUNT OFF;
更新产品
当单价=18.00时,设置单价=案例,然后设置20
当单价<25.00时,则为30
其他单价
结束
--编辑-- 在我发布了最初的答案后,问题被改变了。这应该适应您想要的新逻辑

Update Products 
set UnitPrice = case when UnitPrice = 18.00 then 20 
                    when UnitPrice < 25.00 then 30
                    else UnitPrice
                    end
更新产品
设置单价=当单价>5且单价<10时,则为15.00
当单价>15且单价<20时,则为25
其他单价
结束

您可以用一条update语句替换整个游标逻辑。这应该做同样的事情

DECLARE @UnitPrice DECIMAL(5, 2);
DECLARE @ProductId INT;
DECLARE UnitPriceUpdateCursor CURSOR
FOR
    SELECT ProductID
    FROM Products;
OPEN UnitPriceUpdateCursor;
FETCH NEXT FROM UnitPriceUpdateCursor INTO @ProductId;
WHILE(@@Fetch_Status = 0)
    BEGIN
        SELECT @UnitPrice = UnitPrice
        FROM Products;
        IF(@UnitPrice BETWEEN 5 AND 10)
            BEGIN
                UPDATE Products
                  SET
                      UnitPrice = 15.00
                WHERE ProductID = @ProductId;
        END;
            ELSE
        IF(@UnitPrice BETWEEN 15 AND 20)
            BEGIN
                UPDATE Products
                  SET
                      UnitPrice = 25
                WHERE ProductID = @ProductId;
        END;
        FETCH NEXT FROM UnitPriceUpdateCursor INTO @ProductId;
    END;
CLOSE UnitPriceUpdateCursor;
DEALLOCATE UnitPriceUpdateCursor;
SET NOCOUNT OFF;
更新产品
当单价=18.00时,设置单价=案例,然后设置20
当单价<25.00时,则为30
其他单价
结束
--编辑-- 在我发布了最初的答案后,问题被改变了。这应该适应您想要的新逻辑

Update Products 
set UnitPrice = case when UnitPrice = 18.00 then 20 
                    when UnitPrice < 25.00 then 30
                    else UnitPrice
                    end
更新产品
设置单价=当单价>5且单价<10时,则为15.00
当单价>15且单价<20时,则为25
其他单价
结束

您可以尝试以下语句

Update Products 
set UnitPrice = case when UnitPrice > 5 and UnitPrice < 10 then 15.00 
                    when UnitPrice > 15 and UnitPrice < 20 then 25
                    else UnitPrice
                    end
Declare@UnitPrice decimal
声明@ProductId int
声明的UnitPriceUpdateCorsor游标
从产品中选择单价
打开UnitPriceUpdateCorStore
从UnitPriceUpdateCorStore获取下一个到@UnitPrice
而(@@Fetch\u Status=0)
开始
从@ProductId=ProductId的产品中选择@UnitPrice=UnitPrice
如果(@UnitPrice=18.00)
开始
更新产品集单价=20,其中ProductId=@ProductId
终点

否则如果(@UnitPrice您可以尝试以下语句

Update Products 
set UnitPrice = case when UnitPrice > 5 and UnitPrice < 10 then 15.00 
                    when UnitPrice > 15 and UnitPrice < 20 then 25
                    else UnitPrice
                    end
Declare@UnitPrice decimal
声明@ProductId int
声明的UnitPriceUpdateCorsor游标
从产品中选择单价
打开UnitPriceUpdateCorStore
从UnitPriceUpdateCorStore获取下一个到@UnitPrice
而(@@Fetch\u Status=0)
开始
从@ProductId=ProductId的产品中选择@UnitPrice=UnitPrice
如果(@UnitPrice=18.00)
开始
更新产品集单价=20,其中ProductId=@ProductId
终点

否则如果(@UnitPrice您在循环中没有FETCH NEXT,因此@FETCH\u状态永远不会更新。您为什么要在此处使用游标?这是一个简单的update语句。我假设您打算在游标中设置@ProductId。如前所述,这将不起任何作用,因为该值将为NULL,并且不会更新任何行。您在循环中没有FETCH NEXT循环因此@@Fetch\u状态从未更新。为什么您首先在此处使用光标?这是一个简单的更新语句。我假设您打算在光标中设置@ProductId。如前所述,这将不会起任何作用,因为该值将为NULL,并且不会更新任何行。谢谢。它可以工作,但我需要范围运算符多个大小写,即介于之间Begin Update Products set UnitPrice=当UnitPrice介于5和10之间时的情况,然后当UnitPrice介于11和15之间时的情况,然后是15,然后是20其他UnitPrice endWell…在我发布我的答案后,您更改了问题中的逻辑。请参阅更新的答案,其中包含您的新规则。谢谢。它起作用,但我需要range Operator多个案例,即在更新产品之间设置单价=当单价介于5和10之间时的案例,然后当单价介于11和15之间时的案例,然后当单价介于11和15之间时的案例,然后是20个其他案例单价endWell…在我发布我的答案后,您更改了问题中的逻辑。请参阅更新的答案,其中包含您的新ru女同性恋。