2015-11-16 1 views
0

Я пытаюсь создать курсор, который передаст несколько переменных, а затем, в конечном итоге, выбор, находящийся внутри курсора, в конечном итоге станет обновлением. Но для моих предварительных этапов это будет просто выбор.Ошибка SQL Cursor - в настоящее время нет выделенного курсора

Однако, когда я запускаю это, я получаю сообщение об ошибке несколько раз. «В переменной« @Cur »в данный момент нет выделенного курсора»

Прошу, пожалуйста, получить некоторую помощь с SQL, поскольку я не уверен, что с ней происходит? Я уверен, что это что-то простое, но я не могу это понять.

PS. игнорировать номера столбцов и номера таблиц, это было, например, для целей.

 DECLARE 
      @VAL1 DATETIME, 
      @VAL2 INT, 
      @VAL3 INT 

     SELECT * INTO #TEMP1 FROM 
      (SELECT 
        BS.COL, 
        BS.COL, 
        BS.COL 
       FROM TABLEB 
        JOIN TABLe1 HO (NOLOCK) ON HO.COL1 = B.COL1 
        JOIN TABLE2 SPB (NOLOCK) ON B.COL2 = SPB.COL2 
        JOIN TABLE3 BS (NOLOCK) ON BS.COL1 = SPB.COL1 
        JOIN TABLE4 SPS (NOLOCK) ON SPS.COL1 = BS.COL1 
        JOIN TABLE5 P (NOLOCK) ON P.COL1 = BS.COL1 
        JOIN TABLE6 (NOLOCK) ON PS.COL1 = SPS.COL1 
       WHERE BS.col1 = 'N' 
        AND SPB.COL1 = 'N' 
        AND SPS.COL2 = 'N' 
        AND PS.COL3 = 'N' 
        AND P.COL4 = 'N' 
        AND B.COL5 = 'N' 
        AND BS.COL5 IS NULL 
        AND PS.COL6 IS NOT NULL 
        AND PS.COL6 IS NULL 
        AND PS.COL7 <= DATEADD(DAY,-10,GETDATE()) 
        AND BS.COL8 IS NOT NULL) Y 

     DECLARE @Cur CURSOR SELECT 
        CASE WHEN 
         BS.COL1 IS NOT NULL 
         THEN ISNULL((SELECT COL2 FROM TABLE1 WHERE COL2 IN (SELECT COL1 FROM #TEMP1)),PS.COL2) 
        WHEN PS.COL2 <> SPS.COL3 THEN SPS.COL5 
        ELSE PS.COL3 END AS 'DATE', 
       BS.COL3, 
       BS.COL2 
      FROM TABLEB 
        JOIN TABLE1 HO (NOLOCK) ON HO.COL1 = B.COL1 
        JOIN TABLE2 SPB (NOLOCK) ON B.COL2 = SPB.COL2 
        JOIN TABLE3 BS (NOLOCK) ON BS.COL1 = SPB.COL1 
        JOIN TABLE4 SPS (NOLOCK) ON SPS.COL1 = BS.COL1 
        JOIN TABLE5 P (NOLOCK) ON P.COL1 = BS.COL1 
        JOIN TABLE6 (NOLOCK) ON PS.COL1 = SPS.COL1 
       WHERE BS.col1 = 'N' 
        AND SPB.COL1 = 'N' 
        AND SPS.COL2 = 'N' 
        AND PS.COL3 = 'N' 
        AND P.COL4 = 'N' 
        AND B.COL5 = 'N' 
        AND BS.COL5 IS NULL 
        AND PS.COL6 IS NOT NULL 
        AND PS.COL6 IS NULL 
        AND PS.COL7 <= DATEADD(DAY,-10,GETDATE()) 
        AND BS.COL8 IS NOT NULL 
       AND PS.COL 3 <= CURRENT_TIMESTAMP 


     OPEN @Cur 
     FETCH NEXT 
     FROM @Cur INTO @VAL1 ,@VAL2,@VAL3 
      WHILE @@FETCH_STATUS = 0 
      BEGIN 
      SELECT * FROM TABLE1 WHERE COL1 = @VAL2 
     FETCH NEXT FROM @Cur INTO @VAL1,@VAL2,@VAL3 
     END 
     CLOSE @Cur 
     DEALLOCATE @Cur 
     DROP TABLE #TEMP1 
+0

Просьба указать используемые dbms. (Это совсем не похоже на ANSI SQL ...) – jarlh

+0

Это настоящий скрипт, который вы используете? Никакие СУБД, о которых я знаю, позволят использовать некотируемые пробелы в именах таблиц и переменных ... – Siyual

+0

Почему вы создаете временную таблицу, если вы ее никогда не читали (не говоря уже о том, что вы ее дважды бросаете)? –

ответ

1

Вам не хватает FOR в «DECLARE @CUR CURSOR SELECT». Измените это на «DECLARE @Cur CURSOR FOR SELECT»

+0

Привет, Адиш, Большое спасибо за вашу помощь :). Я попробую это. – user3482471

0

В моем случае из-за несоответствия условия следующий оператор не уволился, поэтому исключение было брошено.

SET @Cur=CURSOR FAST_FORWARD FOR 
Смежные вопросы