T-SQL WHILE(SELECT())

时间:2018-12-07 04:07:08

标签: sql-server tsql

我正在尝试做一些事情,用任何一种语言,我花不到一分钟的时间。我正在尝试“排序”存储过程中的表,但令我惊讶的是,这是不可能的。

所以我试图创建一个存储过程,仅用于测试/学习目的,使用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

但是在他们的示例中看起来两者都不起作用。

2 个答案:

答案 0 :(得分:1)

通常来说,当您第一次尝试SQL时,最好不要将其与其他常见的非RDBMS语言关联。完全不同,在某种程度上,如果您发现自己在SQL中进行了迭代(使用诸如WHILECURSOR之类的方法),则几乎总是一个危险信号。

  

更新某些行,范围从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

答案 1 :(得分:0)

您也可以这样做:

update parser set tempID=id+1
   where id in (select id from table where condition...)