powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что с курсором?
20 сообщений из 20, страница 1 из 1
Что с курсором?
    #32054956
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
6.5
Есть хранимая процедура, в ней открывается курсор на обновление. Если запускать в ЕМ, то все работает правильно, в цикле происходит перемещение по всем записям курсора, и все записи обновляются правильно. Если же запускать ее из клиента (VB6), то процедура работает неправильно. Обновляются не все записи, причем они всегда идут подряд и с конца. Например, последние 3 записи, а в другой раз может 2 или 5. Такое ощущение, что цикл выполняется не до конца, и заканчивается до того как обработана последняя запись. Причем, никогда не обновляются все записи. Обязательно несколько последних остается необновленными.
Из клиента запускаю процедуру следующим образом
Dim MyConnection as new ADODB.Connection
..........
MyConnection.Execute("MyProc param1, param2")

Сообщений об ошибках нет. В ЕМ процедура работает всегда, так как и должна. В процедуру нет никаких сравнений со значением getdate().
...
Рейтинг: 0 / 0
Что с курсором?
    #32055004
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плиз, помогите. База рабочая, позарез надо. Не могу же я на работу в 6-00 приходить каждый день, чтоб эти несколько записей обновить как надо.
...
Рейтинг: 0 / 0
Что с курсором?
    #32055008
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Два варианта:

1. Cамостоятельно трассируете (вроде в 6 было приложение SQL Tracer?) вызовы из VB
2. Приводите код процедуры

Удачи
...
Рейтинг: 0 / 0
Что с курсором?
    #32055031
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй STATIC-курсор
...
Рейтинг: 0 / 0
Что с курсором?
    #32055046
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как у вас с ORDER BY в курсоре дела обстоят?
...
Рейтинг: 0 / 0
Что с курсором?
    #32055048
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для этого куска кода мож DB-libriry -использовать?(не помню как точно пишется?) Всё равно не собираешься уходить с 6.5 :))
...
Рейтинг: 0 / 0
Что с курсором?
    #32055051
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для процедуры, очевидно, всё равно, откуда запускать.
Я думаю, причина - разные настройки коннекта.
Выясните их в вашем приложении и в QA.
...
Рейтинг: 0 / 0
Что с курсором?
    #32055053
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а не может быть так....
что когда вы запускаете процу из QA вы работаете с базай один....
а когда из приложения то работают еще люди....
может тип курсора не тот.....
...
Рейтинг: 0 / 0
Что с курсором?
    #32055175
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE PROCEDURE sp_ChangePathDateCopyer(@DateStart char(8))
AS

if (not exists (SELECT ID FROM PathCopyer WHERE DateFrom=@DateStart OR DateTo=@DateStart))
BEGIN

DECLARE UpdateCursor CURSOR FOR SELECT ID, DateFrom, DateTo FROM PathCopyer WHERE DateFrom <> null OR DateTo <>NULL ORDER BY ID
OPEN UpdateCursor
FETCH UpdateCursor
WHILE @@Fetch_Status=0
begin
UPDATE
PathCopyer
SET
DateFrom=case DateFrom
when null then null
else @DateStart
end,
DateTo=case DateTo
when null then null
else @DateStart
end
WHERE CURRENT OF UpdateCursor
FETCH UpdateCursor
END
CLOSE UpdateCursor
DEALLOCATE UpdateCursor
END


ID - ключевое поле, по началу в курсоре его не было (кластеред), но вычитал, что лучше его использовать, потому что
без него не известно какое поле выберет сервер для упорядочивания перемещений по записям курсора в цикле.
Я думал, что это поможет, потому как в курсоре обновляются оба поля DateFrom и DateTo, одно из которых точно и использовалось
для упорядочивания. Не помогает, результат прежний. Плиз, очень нужно разобраться!
Да, еще такой момент. Теперь перестали именно обновляться конкретные записи, 7 последних записей.
Последних, это если их выводить запросом с ORDER BY ID,
т.е. в таком же порядке как по ним перемещается курсор.
Или он не в таком порядке перемещается?

4 akuz
ORDER BY тоже не помог

4 dao
Что ж мне и OLEDB и ADO использовать сразу. Нехочется так. Да и зачем? Ведь все, что OLEDB позволяет можно сделать с помощью T-SQL (так мне кто-то когда-то ответил на вопрос и это так и есть)

4 MiCe
Дело обстоит так.
Эта процедура запускается один раз в сутки, в 00-00.
В это время у нас на работе никого как бы нет. Соединение с БД может быть только одно (одна клиентская часть болтается на сервере). Это и поддтверждают логи, что после рабочего дня никаких коннектов к базе не происходит. Когда я все это запускал я отрубал всех от БД и закрывал им к ней доступ. Просто засунуть эту процедуру в шедулер на сервере не могу. Запуском этой процедуры должен управлять человек из клиентской части, который не может управлять ее выполнением через шедулер. Т.е. не факт, что нужно обязательно каждый день в 00-00, может сегодня запускать, а потом пару дней нет.

Ужас, сегодня опять пришлось вручную все обновлять =(
...
Рейтинг: 0 / 0
Что с курсором?
    #32055178
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем здесь курсор?
...
Рейтинг: 0 / 0
Что с курсором?
    #32055179
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такая конструкция не подходит?
BEGIN TRAN
UPDATE PathCopyer SET DateFrom =@DateStart WHERE DateFromIs Not Null
UPDATE PathCopyer SET DateTo =@DateStart WHERE DateFromIs Not Null
COMMIT TRAN
...
Рейтинг: 0 / 0
Что с курсором?
    #32055188
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4 Nickolay

Просто ситуация такая, что на PathCopyer висит триггер на insert и update, который проверяет какое количество записей обновляется. Если >1, то делает откат, тем самым не давая обновить сразу несколько записей. Такова логика приложения, и думаю, что нельзя ее назвать неправильной. По его логике обновление нескольких записей сразу не должно проходить. Если апдейт обновляет только одну запись, то он должен проходить, иначе (если нужно обновить несколько записей) только курсором. В тригере происходит некоторая обработка записей, причем она не может работать с выборкой, а только с одной записью. Не буду описывать, что да как, просто примите это как факт, что можно сделать только так.
...
Рейтинг: 0 / 0
Что с курсором?
    #32055196
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это триггер на апдейт

CREATE TRIGGER ut_PathCopyer ON dbo.PathCopyer
FOR UPDATE
AS
IF (@@ROWCOUNT<>1) ROLLBACK
ELSE IF (UPDATE(PathFrom) OR UPDATE(DateFrom) OR UPDATE(PathTo) OR UPDATE(DateTo) OR UPDATE(Op)) AND (NOT Update(IDDeleted) AND NOT Update(OpOrder))
BEGIN
DECLARE @MaxIDDeleted int

SELECT @MaxIDDeleted=isnull(max(ID),0)+1 FROM DeletedPathCopyer
UPDATE PathCopyer SET IDDeleted=@MaxIDDeleted WHERE ID=(SELECT ID FROM INSERTED)
INSERT DeletedPathCopyer (ID,PathFrom,DateFrom,PathTo,DateTo,Op) SELECT @MaxIDDeleted,PathFrom,DateFrom,PathTo,DateTo,Op FROM INSERTED
END
GO
...
Рейтинг: 0 / 0
Что с курсором?
    #32055197
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и в DeletedPathCopyer получается что-то вроде архива в записей PathCopyer
...
Рейтинг: 0 / 0
Что с курсором?
    #32055199
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понимает ли 6.5 такой синтаксис как
alter table tablename disable trigger triggername
если понимает - то выключите его
и сделайте как пишет Nickolay + алгоритм триггера....
...
Рейтинг: 0 / 0
Что с курсором?
    #32055200
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю в чём корень Вашего зла кроится но вот выражение в SP:
DateFrom <> null OR DateTo <>NULL
На мой взгляд однозначно надо поменять на:
DateFrom is not null OR DateTo is not NULL
A то как то неоднозначно получается.
...
Рейтинг: 0 / 0
Что с курсором?
    #32055217
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4 MiCe

Я уже с этим сталкивался, 6.5, помоему, такого не понимает, толко удаление и после опять создание тригера.
Но вопрос не в том как обойти триггер, а как правильно заставить работать курсор.
Может быть alexeyvg по поводу настроек сервера и клиента объяснит поконкретнее, что имеется ввиду? Параметры ADODB.Connection?

4 Alex_B
В WHERE без разницы, что <>NULL, что is not NULL. Тут скорее неоднозначно можно воспринять null и NULL =)

Может и в заправду дело в клиенте???
...
Рейтинг: 0 / 0
Что с курсором?
    #32055221
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вспомнил был и у меня подобный баг. Попробуйте в SP поставить:
SET NOCOUNT ON
...
Рейтинг: 0 / 0
Что с курсором?
    #32055229
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4 Nickolay

На

DECLARE UpdateCursor CURSOR STATIC ....

сервер ругается.

А такое можно в 6.5? Я просто не знаю. Нет помоему.

По всей видимости что-то происходит с записями в курсоре
в то время пока они перебираются в цикле. Я имею ввиду расположение записей в курсоре. Но там ведь кластерный индекс, вроде его и должен использовать сервер при создании курсора, я его не обновляю, значит и порядок записей в созданном курсоре не должен меняться. Так или не так? И записи в цикле должны перебираться в соответствии с этим порядком. Или все совсем не так?
...
Рейтинг: 0 / 0
Что с курсором?
    #32055237
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПАСИБО 4 Alex_B!!!!!!

РАБОТАЕТ!!!!!!!!!!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что с курсором?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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