如何避免在使用 while 的存储过程中重复相同的记录?

How to avoid repeating the same record in stored procedure using while?

我正在编写一个存储过程,需要我按班次动态计算时间。

基本上第一行是固定的,所以后面的行应该可以用下面的简单代码自行生成。

有人可以帮我解决这个问题吗?我的 while 给出了相同的记录。我附上一张图片,这样会更容易理解。

CREATE TABLE #TimeSlot
(    
         Parameter nvarchar(Max) null,
         DisplayStartTime varchar(32) not null,
         DisplayEndTime nvarchar(50)null,
         CodeEndTime nvarchar(50) null,
         Frequency int null,
         Tolerance int null
)   

INSERT INTO #TimeSlot(Parameter, DisplayStartTime, DisplayEndTime, CodeEndTime, Frequency, Tolerance)
   SELECT DISTINCT 
      Parameter, '23:00:00', 
      LTRIM((RIGHT(CONVERT(VARCHAR(100), DATEADD(minute, convert(int, CONVERT(int, Frequency)), '23:00:00'), 120), 8))) as DisplayEndTime
      ,LTRIM((RIGHT(CONVERT(VARCHAR(100), DATEADD(minute, convert(int, CONVERT(int, Frequency) + Tolerance), '23:00:00'), 120), 8))) as CodeEndTime
,Frequency,Tolerance
   FROM
      tableTest

WHILE (@intFlag <=3)
BEGIN
    INSERT INTO #TimeSlot (Parameter, DisplayStartTime, DisplayEndTime, CodeEndTime, Frequency, Tolerance)
       SELECT
          Parameter, DisplayEndTime,
          LTRIM((RIGHT(CONVERT(VARCHAR(100), DATEADD(minute, convert(int, CONVERT(int, Frequency)), DisplayEndTime), 120), 8))) as DisplayEndTime,
          LTRIM((RIGHT(CONVERT(VARCHAR(100), DATEADD(minute, convert(int, CONVERT(int, Frequency) + Tolerance), DisplayEndTime), 120), 8))) as CodeEndTime,
          Frequency,
          Tolerance 
       FROM 
          #TimeSlot

    SET @intFlag = @intFlag + 1
End

我的预期结果: 我需要一些可以重复查询而不重复相同参数的 DisplayStartTime、DisplayEndTime 的记录的东西。

你可以借助 CTE 作为计数 table 和交叉连接来实现它,我做了一个只有 3 行的简单的,但你可以围绕 SO 搜索更完整和高级的示例或 Google.

试试这个:

with cte (n) as (
    select 1 UNION ALL
    select 2 UNION ALL
    select 3 
),
tableTest (
    [Parameter],
    DisplayStartTime,
    DisplayEndTime,
    CodeEndTime,
    Frequency,
    Tolerance
) as (
SELECT DISTINCT 
    Parameter, 
    '23:00:00', 
    LTRIM((RIGHT(CONVERT(VARCHAR(100), DATEADD(minute, convert(int, CONVERT(int, Frequency)), '23:00:00'), 120), 8))) as DisplayEndTime,
    LTRIM((RIGHT(CONVERT(VARCHAR(100), DATEADD(minute, convert(int, CONVERT(int, Frequency) + Tolerance), '23:00:00'), 120), 8))) as CodeEndTime,
    Frequency,
    Tolerance
FROM tableTest
)
select
    tt.[Parameter],
    DATEADD(MINUTE,Frequency*cte.n,DisplayStartTime) DisplayStartTime,
    DATEADD(MINUTE,Frequency*cte.n,DisplayEndTime) DisplayEndTime,
    DATEADD(MINUTE,(Frequency*cte.n)+ Tolerance,DisplayEndTime) CodeEndTime,
    Frequency,
    Tolerance
from tableTest tt
cross join cte