2016-06-23 10 views
-2

次のSQL Serverネストされたカーソルステートメントを定義しようとしました。カレンダーをループし、cut_calendarからsd_calendarに移行しました。各カレンダーには暦日もあります。また、カレンダー移動ごとに移動します。私はこれを実行すると、私はエラーを取得、次のSQL Serverネストされたカーソル構文エラー

DECLARE @id NUMERIC(20) 
    DECLARE @sdCalendarId NUMERIC(20) 
    DECLARE @calendarTypId NUMERIC(5) 
    DECLARE @name NVARCHAR(35) 
    DECLARE @description NVARCHAR(255) 
    DECLARE @ptyId NUMERIC(20) 
    DECLARE @lockCode NVARCHAR(20) 
    DECLARE @dataOwnerId NUMERIC(20) 
    DECLARE @cntId NUMERIC(20) 
    DECLARE @nonBusinessDaysMonday CHAR(1) 
    DECLARE @nonBusinessDaysTuesday CHAR(1) 
    DECLARE @nonBusinessDaysWednesday CHAR(1) 
    DECLARE @nonBusinessDaysThursday CHAR(1) 
    DECLARE @nonBusinessDaysFriday CHAR(1) 
    DECLARE @nonBusinessDaysSaturday CHAR(1) 
    DECLARE @nonBusinessDaysSunday CHAR(1) 
    DECLARE @ccyId NUMERIC(20) 
    DECLARE @code NVARCHAR(30) 
    DECLARE @version NUMERIC(10) 
    DECLARE @seal VARCHAR(255) 
    DECLARE @lstUpdTs DATETIME 
    DECLARE @day_id NUMERIC(20) 
    DECLARE @day_calDate DATETIME 
    DECLARE @day_lockCode NVARCHAR(20) 
    DECLARE @day_calComment NVARCHAR(255) 
    DECLARE @day_dataOwnerId NUMERIC(20) 
    DECLARE @day_calendarId NUMERIC(20) 
    DECLARE @day_calRecurring CHAR(1) 
    DECLARE @day_version NUMERIC(10) 
    DECLARE @day_seal VARCHAR(255) 
    DECLARE @day_lstUpdTs DATETIME 
    DECLARE @day_sdCalendarDaysId NUMERIC(20) 
    DECLARE @sdCodeId NUMERIC(20) 


    DECLARE cursorCutoffCalendar CURSOR FOR 
     SELECT ID, NAME, CALENDAR_TYP_ID,DESCRIPTION,PTY_ID,LOCK_CODE,DATA_OWNER_ID,CNT_ID,NON_BUSINESS_DAYS_MONDAY,NON_BUSINESS_DAYS_TUESDAY,NON_BUSINESS_DAYS_WEDNESDAY,NON_BUSINESS_DAYS_THURSDAY,NON_BUSINESS_DAYS_FRIDAY,NON_BUSINESS_DAYS_SATURDAY,NON_BUSINESS_DAYS_SUNDAY,CCY_ID,CODE,VERSION,SEAL,LST_UPD_TS 
     FROM CUT_CALENDAR 
     WHERE ID != 1 

    OPEN cursorCutoffCalendar 
    FETCH NEXT FROM cursorCutoffCalendar INTO @id, @name, @calendarTypId, @description, @ptyId, @lockCode, @dataOwnerId, @cntId, @nonBusinessDaysMonday, @nonBusinessDaysTuesday, @nonBusinessDaysWednesday, @nonBusinessDaysThursday, @nonBusinessDaysFriday, @nonBusinessDaysSaturday, @nonBusinessDaysSunday, @ccyId, @code, @version, @seal, @lstUpdTs 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SELECT @sdCalendarId = COALESCE(MAX(ID),1) FROM SD_CALENDAR 
     SET @sdCalendarId = @sdCalendarId + 1 

     UPDATE CUT_CALENDAR_DAY 
     SET CALENDAR_ID = @sdCalendarId 
     WHERE CALENDAR_ID = @id 

     SELECT @sdCodeId = ID FROM SD_CALENDAR WHERE CODE = @code 
     IF @sdCodeId > 0 
      SET @code = CONCAT(@code, '_co') 
     ELSE 

     INSERT INTO SD_CALENDAR (ID, NAME, CALENDAR_ROLE_ID,DESCRIPTION,USE_IN_CUTOFF,PTY_ID,LOCK_CODE,DATA_OWNER_ID,CNT_ID,NON_BUSINESS_DAYS_MONDAY,NON_BUSINESS_DAYS_TUESDAY,NON_BUSINESS_DAYS_WEDNESDAY,NON_BUSINESS_DAYS_THURSDAY,NON_BUSINESS_DAYS_FRIDAY,NON_BUSINESS_DAYS_SATURDAY,NON_BUSINESS_DAYS_SUNDAY,CCY_ID,CODE,VERSION,SEAL,LST_UPD_TS) 
     VALUES(@sdCalendarId, @name, @calendarTypId,@description,1,@ptyId,@lockCode,@dataOwnerId,@cntId,@nonBusinessDaysMonday,@nonBusinessDaysTuesday,@nonBusinessDaysWednesday,@nonBusinessDaysThursday,@nonBusinessDaysFriday,@nonBusinessDaysSaturday,@nonBusinessDaysSunday,@ccyId,@code,@version,@seal,@lstUpdTs) 

     DECLARE cursorCutoffCalendarDays CURSOR FOR 
      SELECT ID, CAL_DATE, LOCK_CODE,CAL_COMMENT,DATA_OWNER_ID,CALENDAR_ID,CAL_RECURRING,VERSION,SEAL,LST_UPD_TS 
      FROM CUT_CALENDAR_DAY 
      WHERE ID != 1 

     OPEN cursorCutoffCalendarDays 
     FETCH NEXT FROM cursorCutoffCalendarDays INTO @day_id, @day_calDate, @day_lockCode, @day_calComment, @day_dataOwnerId, @day_calendarId, @day_calRecurring, @day_version, @day_seal, @day_lstUpdTs 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 
      SELECT @day_sdCalendarDaysId = COALESCE(MAX(ID),1) FROM SD_CALENDAR_DAY 
      SET @day_sdCalendarDaysId = @day_sdCalendarDaysId + 1 

      INSERT INTO SD_CALENDAR_DAY (ID, CAL_DATE, LOCK_CODE,CAL_COMMENT,DATA_OWNER_ID,CALENDAR_ID,CAL_RECURRING,VERSION,SEAL,LST_UPD_TS) 
      VALUES(@day_sdCalendarDaysId, @day_calDate, @day_lockCode, @day_calComment, @day_dataOwnerId, @day_calendarId, @day_calRecurring, @day_version, @day_seal, @day_lstUpdTs) 


     FETCH NEXT FROM cursorCutoffCalendarDays INTO @day_sdCalendarDaysId, @day_calDate, @day_lockCode, @day_calComment, @day_dataOwnerId, @day_calendarId, @day_calRecurring, @day_version, @day_seal, @day_lstUpdTs 

     END 
     CLOSE cursorCutoffCalendarDays 
     DEALLOCATE cursorCutoffCalendarDays 
     GO 

     DELETE FROM CUT_CALENDAR 
     WHERE ID = @id 

    FETCH NEXT FROM cursorCutoffCalendar INTO @sdCalendarId, @name, @calendarTypId, @description, @ptyId, @lockCode, @dataOwnerId, @cntId, @nonBusinessDaysMonday, @nonBusinessDaysTuesday, @nonBusinessDaysWednesday, @nonBusinessDaysThursday, @nonBusinessDaysFriday, @nonBusinessDaysSaturday, @nonBusinessDaysSunday, @ccyId, @code, @version, @seal, @lstUpdTs 

    END 
    CLOSE cursorCutoffCalendar 
    DEALLOCATE cursorCutoffCalendar 
    GO 

SQLServerException: Incorrect syntax near 'cursorCutoffCalendarDays'.

cursorCutoffCalendarDaysは私の文の内側のカーソルです。

+0

何ラインを試してみてください、この行から移動を削除するには、上のエラーですか?それはスタートになるだろう。これをデバッグしようとするのではなく、プロセスをセットベースの方法で書き直す方が良いでしょう。 2つのカーソルではなく、2つのセット・ベースの挿入ステートメントであってはならない理由はわかりません。 – GarethD

答えて

0

からGOを削除してください:

CLOSE cursorCutoffCalendarDays 
    DEALLOCATE cursorCutoffCalendarDays 
    GO 

そして、私はあなたがGarethDからもらったコメントに同意、私はこのようなカーソルを書き込むために使用されるが、その後、私はカーソルなしでそれを行う方法を求め、素敵な説明を得ました

0

Blockquote

CLOSE cursorCutoffCalendarDays 
DEALLOCATE cursorCutoffCalendarDays 
関連する問題