Курсор с вопросом о хранимой процедуре - PullRequest
2 голосов
/ 21 февраля 2009

Мне нужно использовать курсор для вызова хранимой процедуры, которая имеет 2 параметра, которые мне нужно передать из таблицы Customers.

Вот что я имею в виду;

Моя цель - передать все идентификаторы CustomerID и CustomerName из таблицы Customers в мою хранимую процедуру AddCustomers, которая имеет 2 параметра CustomerID и CustomerName. То есть: AddCustomer [CustomerID], [CustomerName] [примечание: эта хранимая процедура AddCustomer выполняет фильтрацию некоторых вещей, которые мне нужны для моих приложений]

Таким образом, конечным результатом использования этого CURSOR с хранимой процедурой является DUMP / PASS всех customerID и CustomerName из таблицы Customers в хранимую процедуру AddCustomer.

Я использовал sp_executesql, но не успешно.

Вот что я пробовал, но не работает.

Declare @CustomerID int
Declare @CustomerName varchar(100)

Declare cur CURSOR READ_ONLY
FOR
SELECT CustomerID, CustomerName
from Customers

OPEN cur

FETCH NEXT FROM cur
INTO @CustomerID, @CustomerName

WHILE @@FETCH_STATUS = 0
BEGIN
   EXEC AddCustomer @CustomerID, @CustomerName 
   FETCH NEXT FROM cur
   INTO @CustomerID, @CustomerName
END

CLOSE cur
DEALLOCATE cur

Я новичок в использовании курсоров, поэтому не уверен, почему это не работает. Если вы можете предоставить какие-либо подсказки или ссылки, я был бы признателен.

Обновление:

ОК, если Cursor НЕ МОЖЕТ выполнить цикл через хранимую процедуру, ТОГДА может кто-нибудь предоставить решение или подсказку для моей проблемы, которая ПРОЙДЕТ все CustomerID и CustomerName из таблицы Customers в моей хранимой процедуре AddCustomer, чтобы я мог выполнять фильтрацию каждого из CustomerID и CustomerName, которые я передаю в хранимую процедуру AddCustomer.

Ответы [ 4 ]

1 голос
/ 21 февраля 2009

Похоже, с синтаксисом все в порядке. Нам действительно нужны сообщения об ошибках, чтобы дать ответ.

Будучи слепым, моим лучшим выстрелом был бы варчар (100) ... возможно, на столе есть нварчар ...

Кажется, с синтаксисом все в порядке. Нам действительно нужны сообщения об ошибках, чтобы предоставить ответ.

Будучи слепым, моим лучшим выстрелом был бы варчар (100) ... возможно, на столе есть нварчар ...

Обновление 1: k, вы упомянули в комментарии

"Тип данных должен быть таким же. I нашли время, чтобы изучить его. Они уникальны для CustoemrID и VARCHAR для CUSTOMERNAME "

Обратите внимание, что вы используете int в переменной customerid. Измените его на: Объявите уникальный идентификатор @CustomerID

1 голос
/ 21 февраля 2009

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

И сообщения об ошибках.

0 голосов
/ 21 февраля 2009

Sam

Бывают случаи, когда использование хранимой процедуры для выполнения задачи, подобной этой, совершенно уместно. Конечно, Ле Дорфье дал мне много хороших советов, но я не согласен с ним по этому поводу. Особенно, если это однократная обработка ваших записей для достижения какой-либо формы преобразования, тогда вы на действительно близки к вашему решению, поскольку я не вижу никаких явных недостатков в вашем коде. Кстати, я использовал один и тот же подход не раз, и он работал очень хорошо.

Итак ... опубликуйте хранимую процедуру, и мы посмотрим, не поможет ли это. Кроме того, какую конкретную ошибку вы видите?

ОБНОВЛЕНИЕ: Подождите, вы просто запускаете это в окне SQL? Я обычно упаковываю эти вещи в другую хранимую процедуру (часто просто временную) и затем запускаю ее. Конечно, может также оказаться, что вам просто нужно выполнить этот код - не используя EXEC, а просто используя кнопку «Выполнить» ... Трудно сказать, основываясь на вашем описании.

ОБНОВЛЕНИЕ 2: Вы говорите выше, что ошибка связана с таблицей. Вы уверены, что определенные вами типы данных верны? Может ли ошибка быть несоответствием между данными, извлеченными из таблицы, и типом переменной, в которую вы ее помещаете?

0 голосов
/ 21 февраля 2009

Почему вы используете курсор? Вы понимаете, что это наименее эффективный, самый сложный способ решения этой проблемы? Существует гораздо больше, чем даже шанс, что вам будет лучше с модифицированной версией вашей хранимой процедуры. Или один из нескольких других шаблонов.


Опять же, простейшим подходом, вероятно, было бы изменение хранимой процедуры (создание новой, если хотите) для ввода.

Или вы можете использовать язык по своему выбору C #, VB и т. Д.), Чтобы запрашивать клиентов и выполнять там циклы хранимой процедуры.

Как вы собираетесь обрабатывать исключения в противном случае /

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