首页 > 解决方案 > T-SQL WHILE (选择 ())

问题描述

我正在尝试用任何语言在不到 1 分钟的时间内完成一些事情。我正在尝试“某种”迭代存储过程中的表,但令我惊讶的是这是不可能的。

所以我正在尝试创建一个存储过程,仅用于测试/学习目的,使用 while ((SELECT)) 方法更新某些行,范围从 96811 到 96815(max(id) 类似于 96830) .

好的,这就是我正在尝试的:

while ((select min(id) from parser) <= 96815)
    begin
        update parser set tempID=id+1 where id<=96815
        if ((select max(tempID) from parser)>=96815)
            break
    end

现在,问题是 while() 没有做我想要的,这基本上是让前 N 行达到 id=96815。那么 UPDATE 应该只适用于该子集。

此时,仅 UPDATE 行本身就足够了。

那么有没有一种方法可以通过任何语言来做我想做的事情,获取记录集,迭代它,更新你需要的东西并退出?

我从 MSDN 中发布的内容中采用了这种方法:

WHILE ((SELECT AVG(ListPrice) FROM dbo.DimProduct) < $300)
    BEGIN
        UPDATE DimProduct
                    SET ListPrice = ListPrice * 2;
        IF ((SELECT MAX(ListPrice) FROM dbo.DimProduct) > $500)
    BREAK;
END

但看起来在他们的例子中它也不起作用。

标签: sql-servertsql

解决方案


一般来说,当您第一次涉足 SQL 时,最好不要将其与其他常见的非 RDBMS 语言联系起来。这是完全不同的,以至于如果你发现自己在 SQL 中迭代(使用类似WHILEorCURSOR的东西),它几乎总是一个危险信号。

更新某些行,范围从 96811 到 96815

所有你需要的是...

UPDATE MyTable              -- Update your table
SET MyValue = MyValue + 1   -- Increase MyValue by 1
WHERE Id >= 96811           -- Wherever the ID is between 96811 and 96815
AND Id <= 96815

推荐阅读