【发布时间】:2020-11-23 00:17:00
【问题描述】:
如果我在 SQL 中编写循环,例如:
DECLARE @Counter INT = 0
SET @length = (SELECT COUNT(*) FROM table)
WHILE @Counter <= @length
BEGIN
DECLARE @id INT = (SELECT TOP 1 id FROM table WHERE id = @Counter)
DECLARE @someValue int = (SELECT TOP 1 someValue FROM table WHERE id = @id)
END
我以前从未在 SQL 中编写过循环,我需要的是从循环中的当前项目中获取值并使用它。
在上面的代码中,我使用SELECT 来获取someValue。
我需要像这样为我需要的所有字段创建select,还是有一些更简单的方法,比如 foreach 循环并获取当前的item.someValue?
更新
基于 cmets 可能我不需要循环。
这是示例表
create table products
(
tourId int NOT NULL IDENTITY PRIMARY KEY,
title nvarchar(50),
orderTime smalldatetime,
orderSecondTime smalldatetime,
orderThirdTime smalldatetime
);
orderTime 有值,orderSecondTime 和 orderThirdTime 是 NULL。
我需要在orderTime 上创建一些CASE..WHEN 并更新orderSecondTime 和orderThirdTime。
当我说CASE...WHEN 时,我需要根据 orderTime 中的日期更新其他列,例如:
orderThirdTime 可以依赖 orderSecondTime 这是我认为循环是自然解决方案的地方。
那些其他列基本上都是加orderSecondTime = 24h + orderTimeorderThirdTime = orderTime to orderSecondTime之类的。
更新 #2:
示例规则:
如果 orderTime 在 08:00 和 10:00 之间:
- orderSecondTime = orderTime + 60 分钟
- orderThirdTime = orderSecondTime(以上计算)+ 60 分钟
- ELSE 使用不同的计算方式,例如加 30 分钟
我有什么
tourId title orderTime orderSecondTime orderThirdTime
-------------------------------------------------------------------
1 prod1 2020-08-02 08:00 null null
2 prod12 2020-08-02 09:00 null null
3 prod13 2020-08-02 10:00 null null
4 prod14 2020-08-02 11:00 null null
我要计算的内容
【问题讨论】:
-
就目前而言,这段代码毫无意义。解释你正在尝试做什么会有所帮助。
-
我有表,我需要遍历每一行,从每一行获取一些列,以便在循环内进行其他计算。在每次迭代中,我都会在另一个表中插入新行(带有计算值)。
-
你为什么首先使用循环? SQL 擅长基于集合的方法,而
WHILE则完全相反。 -
您可能不需要循环。如果您向我们提供完整的图片,那么我们可能会提出比循环更有效的建议。
-
我更新了问题,详细说明了我正在尝试做什么以及为什么我认为循环是这种情况的解决方案。
标签: sql sql-server datetime sql-server-2008 sql-update