SQL中的WHILE循环,我希望循环一次,通过所有行进行5次更新

时间:2017-01-08 06:16:19

标签: sql-server tsql

我在SQL查询中有一个WHILE LOOP。

我有一张5 ROWS与计数器匹配的表

我正在随机化2048行并希望在这些行上插入1 - 5,随机插入单个列,但我得到的是,查询循环一次超过2048并插入“1”,然后循环一秒时间并插入“5”,然后插入“3”,然后“4”,最后插入“2”。

我寻求的是在2048行中循环一次并在单列中随机插入1到5到2048行(1次)。

这是可行的但错误的SQL。

declare @counter int
SET @counter = 1
BEGIN TRAN
WHILE (@counter <= 6)
BEGIN
SELECT id, city, wage_level 
    FROM myFirstTable
    ORDER BY NEWID()

    UPDATE myFirstTable
        SET wage_level = @counter
        SET @counter = @counter + 1
    CONTINUE
END
COMMIT TRAN 

表中包含5行的值无关紧要,但该表中的“ID”是1 - 5“ARE”。

我很近,但没有雪茄......

结果应该是这样的:

id-----city------wage_level
---------------------
1      Denver        2
2      Chicago       3
3      Seattle       5
4      Los Angeles   1
5      Boise         4
---
2047   Charleston    2
2048   Rochester     1

等等......

谢谢大家

1 个答案:

答案 0 :(得分:2)

无需循环。 SQL在基于集合的方法中效果最佳 这是一种方法:

创建并填充样本表(在将来的问题中保存此步骤)

CREATE TABLE myFirstTable
(
    id int identity(1,1), 
    city varchar(20), 
    wage_level int
)

INSERT INTO myFirstTable (city) VALUES
('Denver'),
('Chicago'),
('Seattle'),
('Los Angeles'),
('Boise')

更新声明:

UPDATE myFirstTable 
SET wage_level = (ABS(CHECKSUM(NEWID())) % 5) + 1

检查更新:

SELECT *
FROM myFirstTable

结果:

id  city        wage_level
1   Denver      3
2   Chicago     3
3   Seattle     2
4   Los Angeles 4
5   Boise       3

说明:使用NEWID()生成guid,CHECKSUM()根据该guid获取数字,ABS()仅获取正值,% 5仅获取值在0到4之间,最后,+ 1只能获得1到5之间的值: