将Oracle存储过程转换为SQL Server存储过程

将Oracle存储过程转换为SQL Server存储过程,sql,sql-server,database,oracle,stored-procedures,Sql,Sql Server,Database,Oracle,Stored Procedures,亲爱的各位,有人能帮我转换以下Oracle存储过程吗 到SQL Server版本 CREATE PROCEDURE Schedule_Employees ( param_from IN VARCHAR2, param_to IN VARCHAR2, param_template_id IN NUMBER) AS start_date NUMBER; end_date NUMBER; template_type NUMBER

亲爱的各位,有人能帮我转换以下Oracle存储过程吗 到SQL Server版本

CREATE  PROCEDURE Schedule_Employees (
param_from          IN VARCHAR2,
param_to            IN VARCHAR2,
param_template_id   IN NUMBER)
AS
start_date      NUMBER;
end_date        NUMBER;
template_type   NUMBER;
rec_no          NUMBER;
days_no         NUMERIC;
day_date        VARCHAR2 (20);
shifts_value    VARCHAR2 (10);
current_shift   VARCHAR2 (10) := '-1';
current_index   NUMERIC := 0;
rec_column       VARCHAR (1);
BEGIN
start_date := TO_NUMBER (TO_CHAR (TO_DATE (param_from, 'dd/MM/yyyy'), 'j'));
end_date := TO_NUMBER (TO_CHAR (TO_DATE (param_to, 'dd/MM/yyyy'), 'j'));

FOR cur_r IN start_date .. end_date
LOOP
  day_date := TO_CHAR (TO_DATE (cur_r, 'j'), 'dd/MM/RRRR');

  FOR employees IN (SELECT EmpID FROM EmployeesTempList)
  LOOP
     SELECT TYPE
       INTO template_type
        FROM WORKSCHEDULES
       WHERE SCHEDULEID = param_template_id;

      SELECT RECNO
       INTO rec_no
       FROM WORKSCHEDULES
      WHERE SCHEDULEID = param_template_id;

     SELECT DAYSNO
       INTO days_no
       FROM WORKSCHEDULES
      WHERE SCHEDULEID = param_template_id;

     IF template_type = 2
     THEN
        SELECT RECURRCEVALUES
          INTO shifts_value
          FROM WORKSCHEDULESDYNAMICDETAILS
         WHERE WORKSCHEDULESID = param_template_id
               AND DAYID = MOD (current_index, days_no);

        SELECT ShiftID
          INTO current_shift
          FROM (WITH DATA AS (SELECT shifts_value str FROM DUAL)
                    SELECT ROWNUM AS ID,
                           TRIM (REGEXP_SUBSTR (str,
                                                '[^-]+',
                                                1,
                                                LEVEL))
                              ShiftID
                      FROM DATA
                CONNECT BY INSTR (str,
                                  '-',
                                  1,
                                  LEVEL - 1) > 0)
         WHERE ID = GetRecurrence (current_index, days_no, rec_no);
     ELSE
        rec_column := GetRecurrence (current_index, 7, 4);
        CASE
            WHEN rec_column = 1 THEN select RECUR1 into current_shift from WORKSCHEDULESDETAILS where WORKSCHEDULESID = param_template_id  and DAYID= ((select to_char(to_date(day_date,'dd/MM/yyyy'),'D') from dual) - 1);
            WHEN rec_column = 2 THEN select RECUR2 into current_shift from WORKSCHEDULESDETAILS where WORKSCHEDULESID = param_template_id  and DAYID= ((select to_char(to_date(day_date,'dd/MM/yyyy'),'D') from dual) - 1);
            WHEN rec_column = 3 THEN select RECUR3 into current_shift from WORKSCHEDULESDETAILS where WORKSCHEDULESID = param_template_id  and DAYID= ((select to_char(to_date(day_date,'dd/MM/yyyy'),'D') from dual) - 1);
            WHEN rec_column = 4 THEN select RECUR4 into current_shift from WORKSCHEDULESDETAILS where WORKSCHEDULESID = param_template_id  and DAYID= ((select to_char(to_date(day_date,'dd/MM/yyyy'),'D') from dual) - 1);
        END CASE;
     END IF;

     DELETE FROM ScheduleEmployees
           WHERE EMPLOYEEID = employees.EmpID
                 AND DAYDATE = TO_DATE (day_date, 'dd/MM/yyyy');

     INSERT INTO ScheduleEmployees (SCHEDULEID,
                                    EMPLOYEEID,
                                    FROMDATE,
                                    TODATE,
                                    DAYDATE,
                                    SHIFTS,
                                    CREATEDATE)
          VALUES (param_template_id,
                   employees.EmpID,
                  TO_DATE (param_from, 'dd/MM/yyyy'),
                  TO_DATE (param_to, 'dd/MM/yyyy'),
                  TO_DATE (day_date, 'dd/MM/yyyy'),
                  current_shift,
                  SYSDATE);
   END LOOP;

   current_index := current_index + 1;
END LOOP;
 DELETE FROM EmployeesTempList;
  COMMIT;
END;
/
我试过的 CREATE PROCEDURE Schedule_Employees ( @param_from VARCHAR(4000), @param_to VARCHAR(4000), @param_template_id FLOAT) AS BEGIN DECLARE @start_date FLOAT; DECLARE @end_date FLOAT; DECLARE @template_type FLOAT; DECLARE @rec_no FLOAT; DECLARE @days_no NUMERIC(38,0); DECLARE @day_date VARCHAR (20); DECLARE @shifts_value VARCHAR (10); DECLARE @current_shift VARCHAR (10) = '-1'; DECLARE @current_index NUMERIC(38,0) = 0; DECLARE @rec_column VARCHAR (1); SET NOCOUNT ON; SET @start_date = TO_NUMBER (TO_CHAR (CONVERT (DATETIME, @param_from, 'dd/MM/yyyy'), 'j')); SET @end_date = TO_NUMBER (TO_CHAR (CONVERT (DATETIME, @param_to, 'dd/MM/yyyy'), 'j'));

   DECLARE cur_r CURSOR FOR start_date .. end_date
   OPEN cur_r;
   FETCH cur_r INTO;
   WHILE @@FETCH_STATUS=0
   BEGIN
     SET @day_date = TO_CHAR (CONVERT (DATETIME, cur_r, 'j'), 'dd/MM/RRRR');

    DECLARE employees CURSOR FOR SELECT EmpID FROM EmployeesTempList;
    OPEN employees;
    FETCH employees INTO;
    WHILE @@FETCH_STATUS=0
    BEGIN
       SELECT @template_type = TYPE
       FROM WORKSCHEDULES
       WHERE SCHEDULEID = @param_template_id;

       SELECT @rec_no = RECNO
       FROM WORKSCHEDULES
       WHERE SCHEDULEID = @param_template_id;

       SELECT @days_no = DAYSNO
       FROM WORKSCHEDULES
       WHERE SCHEDULEID = @param_template_id;

       IF @template_type = 2
       BEGIN
        SELECT @shifts_value = RECURRCEVALUES
          FROM WORKSCHEDULESDYNAMICDETAILS
          WHERE WORKSCHEDULESID = @param_template_id
               AND DAYID = (@current_index % @days_no);

         SELECT @current_shift = ShiftID
          FROM (WITH DATA AS (SELECT @shifts_value str)
                    SELECT ROWNUM AS ID,
                           RTRIM(LTRIM (REGEXP_SUBSTR (str,
                                                '[^-]+',
                                                1,
                                                LEVEL))
                              ShiftID
                      FROM DATA
                CONNECT BY INSTR (str,
                                  '-',
                                  1,
                                  LEVEL - 1) > 0)
         WHERE ID = GetRecurrence (@current_index, @days_no, @rec_no);
     END
     ELSE BEGIN
        SET @rec_column = GetRecurrence (@current_index, 7, 4);
        CASE
            WHEN @rec_column = 1 THEN select @current_shift = RECUR1 from WORKSCHEDULESDETAILS where WORKSCHEDULESID = @param_template_id  and DAYID= ((select to_char(convert(DATETIME, @day_date,'dd/MM/yyyy'),'D')) - 1);
            WHEN @rec_column = 2 THEN select @current_shift = RECUR2 from WORKSCHEDULESDETAILS where WORKSCHEDULESID = @param_template_id  and DAYID= ((select to_char(convert(DATETIME, @day_date,'dd/MM/yyyy'),'D')) - 1);
            WHEN @rec_column = 3 THEN select @current_shift = RECUR3 from WORKSCHEDULESDETAILS where WORKSCHEDULESID = @param_template_id  and DAYID= ((select to_char(convert(DATETIME, @day_date,'dd/MM/yyyy'),'D')) - 1);
            WHEN @rec_column = 4 THEN select @current_shift = RECUR4 from WORKSCHEDULESDETAILS where WORKSCHEDULESID = @param_template_id  and DAYID= ((select to_char(convert(DATETIME, @day_date,'dd/MM/yyyy'),'D')) - 1);
        END CASE;
     END 

     DELETE FROM ScheduleEmployees
           WHERE EMPLOYEEID = employees.EmpID
                 AND DAYDATE = CONVERT (DATETIME, @day_date, 'dd/MM/yyyy');

     INSERT INTO ScheduleEmployees (SCHEDULEID,
                                    EMPLOYEEID,
                                    FROMDATE,
                                    TODATE,
                                    DAYDATE,
                                    SHIFTS,
                                    CREATEDATE)
          VALUES (@param_template_id,
                   employees.EmpID,
                  CONVERT (DATETIME, @param_from, 'dd/MM/yyyy'),
                  CONVERT (DATETIME, @param_to, 'dd/MM/yyyy'),
                  CONVERT (DATETIME, @day_date, 'dd/MM/yyyy'),
                  @current_shift,
                  GETDATE());
  FETCH employees INTO;
  END;
  CLOSE employees;
  DEALLOCATE employees;

  SET @current_index = @current_index + 1;
  FETCH cur_r INTO;
  END;
  CLOSE cur_r;
  DEALLOCATE cur_r;
  DELETE FROM EmployeesTempList;
  COMMIT;
  END;
  GO

您能提供数据进行测试吗?您的数据类型有问题,但似乎是从oracle开始的。你为什么用数字代替日期?这就是数据类型的要点,使用正确的数据类型。oracle中的游标没有sql server那么糟糕,但这里不需要循环和游标。这可以是基于设置的,在oracle中也应该是基于设置的。您可以提供要测试的数据吗?您的数据类型有问题,但似乎是从oracle开始的。你为什么用数字代替日期?这就是数据类型的要点,使用正确的数据类型。oracle中的游标没有sql server那么糟糕,但这里不需要循环和游标。这可以设置为基础,也应该在oracle中设置为基础。