Хранимая процедура с использованием табличной функции и курсора. Ошибка получения курсора не существует - PullRequest
0 голосов
/ 18 марта 2019

Я получаю следующую ошибку при запуске хранимой процедуры. Хранимая процедура вызывает функцию, которая объявляет курсор для таблицы, используя функцию, которая возвращает функцию табличного значения. Обратите внимание, что я не включил раздел декларации кода

declare cust_trn cursor local for SELECT * FROM [dbo].[Q03_Create_Customer_Trn](@COUNTERPARTY)

IF CURSOR_STATUS('local','cust_trn') <>-1 
BEGIN
    OPEN cust_trn
END

FETCH NEXT FROM cust_trn  INTO @trn,@cust_name;

WHILE @@FETCH_STATUS=0
  BEGIN    
      IF (@LIST1 IS NULL) BEGIN
          SET @LIST1= @cust_name;
      END
      ELSE BEGIN
          SET @LIST1=ISNULL(@LIST1, '') + ';' + ISNULL(@cust_name, '');
      END 
   FETCH NEXT FROM cust_trn INTO @trn,@cust_name; END   END ELSE BEGIN  SET @LIST1 = 'N/A'; END CLOSE cust_trn ; DEALLOCATE  cust_trn; RETURN ISNULL(@LIST1,'N/A'); END; ISNULL(@LIST1,'N/A'); END;

Ошибка: Курсор с именем 'имя_курсора' не существует Функция начала вызывается как dbo.Q03_get_list_of_counterparties (COUNTERPARTY, 'Y') CParties в хранимой процедуре ,

1 Ответ

1 голос
/ 18 марта 2019

Вы можете переписать всю логику курсора во что-то вроде этого.

declare @List varchar(500) = '' --use whatever size is relevant.

select @List = @List + cust_name + ';'
from [dbo].[Q03_Create_Customer_Trn](@COUNTERPARTY)

select @List = left(@List, len(@List) - 1) --removes the last comma

Другой вариант - использовать STUFF и FOR XML. Есть сотни и сотни примеров этого по всему Интернету.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...