【问题标题】:Loops and Cursors in Oracle into Sql ServerOracle 中的循环和游标到 Sql Server
【发布时间】:2017-06-29 03:51:19
【问题描述】:

我有一段代码用于尝试将其从 Oracle 转换为 Sql Server 的函数:

甲骨文代码:

    If nDaysAfter = 0 then

    while (IsHoliday(dNextDay) = 1) or (RTrim(To_Char(dNextDay, 'DAY')) in ('SATURDAY','SUNDAY')) Loop
    dNextDay := dNextDay + 1;
  End Loop;

  RETURN dNextDay;

Else   dNextDay := dNextDay + 1;
  For i in 1..nDaysAfter Loop

    while (IsHoliday(dNextDay) = 1) or (RTrim(To_Char(dNextDay, 'DAY')) in ('SATURDAY','SUNDAY')) Loop
      dNextDay := dNextDay + 1;
    End Loop;
    dNextDay := dNextDay + 1;

  End Loop;
  RETURN dNextDay - 1;
  End if;

Sql 服务器代码:

    If @nDaysAfter = 0 begin

   while (IsHoliday(@dNextDay) = 1) or (RTrim(convert(char,@dNextDay, 'DAY')) in ('SATURDAY','SUNDAY')) Begin
    SET @dNextDay = @dNextDay + 1;
  End;

 RETURN @dNextDay;

End
Else BEGIN 
SET @dNextDay = @dNextDay + 1;
Declare i CURSOR for 1..nDaysAfter Loop

while (IsHoliday(@dNextDay) = 1) or (RTrim(convert(char,@dNextDay, 'DAY')) in ('SATURDAY','SUNDAY')) Begin
      SET @dNextDay = @dNextDay + 1;
    End;
    SET @dNextDay = @dNextDay + 1;

  Fetch i INTO;
  End;
  Close i;
  Deallocate i;
  RETURN @dNextDay - 1;
  End 

我在转换这一行时遇到问题:Declare i CURSOR for 1..nDaysAfter Loop 它在数字 1 下突出显示。(nDaysAfter 被声明为 Float) 谢谢,我将不胜感激。

【问题讨论】:

  • 这个循环在做什么?这听起来像是日历表而不是循环的工作。
  • Oracle 中的游标比 SQL Server 好得多。我会尝试以不同的方式执行此操作,以便您不使用游标。我支持日历表的想法,而不是所有这些函数一遍又一遍地进行相同的计算。

标签: sql-server oracle function loops while-loop


【解决方案1】:

我会用 WHILE 循环替换 SQL 服务器代码中的光标。

declare @i int = 1
while @i <= nDaysAfter
begin
    while (dbo.IsHoliday(@dNextDay) = 1) or (RTrim(convert(char,@dNextDay, 'DAY')) in ('SATURDAY','SUNDAY')) 
    Begin
      SET @dNextDay = @dNextDay + 1;
    End
      SET @dNextDay = @dNextDay + 1;

  set @i = @i+1
End

  RETURN @dNextDay - 1;

【讨论】:

  • 它工作了我稍微改变了它包括@ for I并重写了这一行:while (dbo.ISHOLIDAY(@dNextDay) = 1) or (RTrim(convert(char,@dNextDay + 'DAY')) in ('SATURDAY','SUNDAY'))。非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2017-05-01
  • 1970-01-01
相关资源
最近更新 更多