powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ошибка в связке Access2000+SQLServer2000+ХП с курсором
7 сообщений из 7, страница 1 из 1
Ошибка в связке Access2000+SQLServer2000+ХП с курсором
    #32842726
BAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеем:
Есть навороченная ХП. В ХП один раз используется курсор. В Query Analyzer (QA) все хорошо выполняется. Запуск ХП в Access дает ошибку "Сохраненная процедура выполена успешно, но ни одной записи не возвращено".
В начале ХП есть "SET NOCOUNT ON", перед результирующим Select'ом "SET NOCOUNT OFF", т.е. в QA при запуске ХП четко формируется только одна таблица-результат (без служебных сообщений).

Для поиска причин порезал ХП, осталось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
...
SET NOCOUNT ON

--Навороченный запрос, который результаты промежуточные записывает во временную таблицу
SELECT КодЛиста
INTO #Табл1
FROM ...

DECLARE Curs CURSOR
LOCAL FAST_FORWARD READ_ONLY
FOR 
SELECT ...
FROM ...
WHERE     
  ... AND КодЛиста NOT IN 
   (SELECT КодЛиста
    FROM #Табл1
   )

OPEN Curs
--сейчас тут просто пусто
CLOSE Curs
DEALLOCATE Curs

SET NOCOUNT OFF
SELECT GetDate() As Время --просто для проверки
Для меня в курсоре очень важна часть
Код: plaintext
1.
2.
3.
4.
WHERE
  ... AND КодЛиста NOT IN 
   (SELECT КодЛиста
    FROM #Табл1
   )

Вообще похожая ситуация с ХП и Access у меня была. Как я понял, Access почему-то хочет, чтобы операция с курсором была в САМОМ НАЧАЛЕ ХП. Действительно, если вот это с начала ХП я забираю
Код: plaintext
1.
2.
SELECT КодЛиста
INTO #Табл1
FROM ...
--соответственно приходится забрать проверку при декларировании курсора "NOT IN"
то все в Access начинает работать.
Возникла идея, что Access хочет видеть в начале ХП работу с курсором, поэтому в начале создавать временнею таблицу #Табл1 нельзя. Но мне она и нужна очень.

Хорошо, тогда забрал первый SELECT и написал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE Curs CURSOR
LOCAL FAST_FORWARD READ_ONLY
FOR 
SELECT ...
FROM ...
WHERE     
  ... AND КодЛиста NOT IN 
   (
SELECT КодЛиста
FROM ... 
   ) --т.е. обошелся подзапросом
Все равно Access ругается. Замучился уже с ним: в QA все работает, а сам Access ругается :-(. Забрал в курсоре подзапрос, Access ХП начал нормально воспринимать. Может кто с похожим встречался?
...
Рейтинг: 0 / 0
Ошибка в связке Access2000+SQLServer2000+ХП с курсором
    #32843136
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
указывать SET NOCOUNT OFF не нужно
Каким образом принимаются данные в Аксес?
...
Рейтинг: 0 / 0
Ошибка в связке Access2000+SQLServer2000+ХП с курсором
    #32844016
BAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В оригинальной ХП этого нет "SET NOCOUNT OFF". Это уже появилось в процессе, когда резал ХП и искал место, которое Access'у не нравится.

Результаты ХП пока никуда не передаются. Просто по Enter запускаю ХП в Access (где перечень всех ХП на сервере виден). Тут же и дается ошибка.

Чего удалось увидеть в результате экспериментов:
1. Если в оригинальной (большой) ХП в цикле обработки курсора
Код: plaintext
1.
2.
3.
4.
SET @Count= 0 
WHILE @Count<@@CURSOR_ROWS
  BEGIN
...
  END
забрать сравнение, написать
Код: plaintext
1.
2.
3.
WHILE  1 <> 1 
  BEGIN
...
  END

то ошибки не возникает (выдается пустая таблица).

2. если перенести работу с курсором в начало ХП, то все начинает работать, но мне надо сделать до работы курсора несколько выборок...

Вообще похожие проблемы у меня уже были с другими ХП, но там все вылечилось переносом работы с курсором в начало процедуры.
...
Рейтинг: 0 / 0
Ошибка в связке Access2000+SQLServer2000+ХП с курсором
    #32844213
BAlex:
Можете сконструировать законченный тестовый пример, воспроизводящий ошибку (чтобы я мог его у себя протестировать), и выложить его здесь?

Дело в том, что моя попытка воспроизвести поведение Access, описанное вами, не удалась.

Что я делал:

1. По образцу кода автора темы создаю следующую не особенно изящную процедуру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Create Procedure test1
As

SET NOCOUNT ON 

create table #ИсхТаблА(
КодЛиста int null,
Назв varchar( 10 ) null
)
insert into #ИсхТаблА values( 1 ,'qwe')
insert into #ИсхТаблА values( 5 ,'poi')

create table #ИсхТаблБ(
КодЛиста int null,
Назв varchar( 10 ) null
)
insert into #ИсхТаблБ values( 1 ,'qwe')
insert into #ИсхТаблБ values( 2 ,'sdf')
insert into #ИсхТаблБ values( 3 ,'zxc')

SELECT КодЛиста INTO #Табл1 FROM #ИсхТаблА

DECLARE Curs CURSOR LOCAL FAST_FORWARD READ_ONLY 
FOR 
	SELECT * FROM #ИсхТаблБ 
		WHERE  КодЛиста NOT IN (SELECT КодЛиста FROM #Табл1 ) 

OPEN Curs 
--сейчас тут просто пусто 
CLOSE Curs 
DEALLOCATE Curs 

SELECT * from #Табл1
return 

2.Запускаю вышеприведённую процедуру двойным кликом в окне базы данных Access. Ошибки не возникает, отображается результирующая таблица.

3. Удаляю строку set nocount on в начале процедуры, и запускаю процедуру снова таким же образом; появляется сообщение "Сохраненная процедура выполнена успешно, но ни одной записи не возвращено."

Всё это совершенно закономерно, поскольку Access ожидает лишь один результирующий набор записей, а без set nocount on процедура их генерирует множество.

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

Эксперименты проводились на MS Access 2000 SP3, MS SQL Server 2000 SP3. Я, конечно, ещё попробую на MS Access 2002, но вряд ли, как мне кажется, дело в этом.
...
Рейтинг: 0 / 0
Ошибка в связке Access2000+SQLServer2000+ХП с курсором
    #32844452
BAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, попробую что-то удобоваримое выставить.

Вот только сейчас дошло, что поля там на украинском языке... Надеюсь, это не будет проблемой
...
Рейтинг: 0 / 0
Ошибка в связке Access2000+SQLServer2000+ХП с курсором
    #32844960
BAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, мучился, мучился... Так и не победил.

Если написать похожую МАЛЕНЬКУЮ процедуру, чтобы создать таблицу, а потом курсор, то все работает. А вот эта большая ХП никак результат в Access не дает, хотя все в QA супер...

В общем, на коротком примере повторить не получается.

Нужные таблицы выгрузил в отдельную базу. Как-то можно разместить файл mdf?

(самое обидное, в QA все сделал, осталось только в Access увидеть результат...)
...
Рейтинг: 0 / 0
Ошибка в связке Access2000+SQLServer2000+ХП с курсором
    #32845303
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Запуск ХП в Access дает ошибку "Сохраненная процедура выполена успешно, но ни одной записи не возвращено".

Это не ошибка - это нормальное сообщение Access о успешно отрботавшей процедуре, КОГДА она вернула сообщение типа
(NNN row(s) affected).

SET NOCOUNT ON

отключает именно его.

SET NOCOUNT OFF
не надо делать... нигде. Иначе будет

"Сохраненная процедура выполена успешно, но ни одной записи не возвращено"

Равно Access плохо реагирует на
print "тру-ля-ля"
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ошибка в связке Access2000+SQLServer2000+ХП с курсором
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]