2017-02-10 14 views
1

У меня есть блок кода для функции пытается преобразовать его из Oracle в SQL Server:Loops и курсоры в Oracle Into Sql Server

Oracle Код:

код
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 Server:

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) Спасибо Я буду признателен, как много помощи поз sible.

+0

Что это за цикл? Это звучит как задание для таблицы календаря вместо циклов. –

+0

Курсоры намного лучше в Oracle, чем SQL-сервер. Я попытался бы сделать это по-другому, чтобы вы не использовали курсоры. Во-вторых, идея таблицы календаря вместо всех этих функций повторяется снова и снова. – HLGEM

ответ

1

Я бы заменил курсор кода SQL на цикл WHILE.

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; 
+1

Это сработало Я изменил его немного, включив @ для I и переписал эту строку: 'while (dbo.ISHOLIDAY (@dNextDay) = 1) или (RTrim (convert (char, @ dNextDay + 'DAY)) в ('суббота', 'Воскресенья')) '. Большое спасибо за помощь –

 Смежные вопросы

  • Нет связанных вопросов^_^