Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Туплю с курсором  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
В процедуре отрабатывает курсор и каким - то образом умудряется вставлять новые записи, хотя команды INSERT внутри нет :
  DECLARE PM CURSOR LOCAL STATIC READ_ONLY FOR SELECT [IdPersonMap], [IdSubj] FROM map.[PersonMap] WHERE ([IdExtSystem]=2) and ([IdSubj] IS NOT NULL) and ([IdExternal] IS NULL);
  OPEN PM;
  FETCH PM INTO @IdPersonMap, @M_idSubj; -- ID соответствия и ID сотрудника
  WHILE @@FETCH_STATUS=0
  BEGIN
    -- наименование сотрудника
    SET @subjPersonName=NULL;
    SELECT @subjPersonName=dbo.[PersonName]([LastName], [FirstName], [Patronymic], [BirthDate], [idSex]) FROM subj.[Person] WITH (nolock) WHERE [IdSubj]=@M_idSubj;

    SET @subjPersonName=dbo.Unify_Str(@subjPersonName, @Correspondence);
    IF LEN(@subjPersonName)>0
    BEGIN
 
     -- соответствующий по наименованию сотрудник в "1С" (преимущественно не уволенный при полном совпадении)
     SET @idSubjExt=NULL;
     SELECT @idSubjExt=[IdSubj] 
     FROM #WS_PERS
     WHERE dbo.Unify_Person([LastName], [FirstName], [Patronymic], [BirthDate], [idSex], @Correspondence)=@subjPersonName
     ORDER BY [Actual];

     UPDATE map.[PersonMap] SET [IdExternal]=@idSubjExt WHERE [IdPersonMap]=@IdPersonMap;
    END;

    FETCH PM INTO @IdPersonMap, @M_idSubj;
  END;
  CLOSE PM;
  DEALLOCATE PM;


Откуда они могут возникать ?
P.S. : похоже записи в некоторых случаях просто дублируются
24 янв 13, 17:00    [13822925]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
defragmentator,

триггер на UPDATE для map.[PersonMap]
24 янв 13, 17:05    [13822948]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
И, может быть, эти записи вставляет кто-то другой?
Вы ж это не в курсоре видите,ибо он объявлен как STATIC!
24 янв 13, 17:06    [13822963]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
iap,

не, триггера там нет. Есть внешние ключи.
24 янв 13, 17:07    [13822968]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
defragmentator,

чуть не забыл! Завязывайте с курсорами. Редко бывают полезны.
24 янв 13, 17:07    [13822972]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
iap,

это процедура переноса штатки из 1С в корпоративную систему.
Тут без курсоров никак.
24 янв 13, 17:12    [13823007]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
каким - то образом умудряется вставлять новые записи, хотя команды INSERT внутри нет :

И почему вы тогда решили, что записи именно вставлются и именно в этом коде ?
Вы логируете все добавления что ли ?
24 янв 13, 17:15    [13823026]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Glory,

вот такой запросик

SELECT PM.[IdPersonMap], PM.[IdSubj], 
       PM.[IdExtSystem],
       PM.[IdExternal], (ISNULL(WSP.[LastName],'')+COALESCE(' '+WSP.[FirstName],''))+COALESCE(' '+WSP.[Patronymic],'') AS 'ФИО во внешней системе'
FROM [map].[PersonMap] PM (nolock)
LEFT JOIN [ws].[Person] WSP (nolock) ON WSP.IdSubj=PM.IdExternal


Выдаёт 178 записей
А вот такой
SELECT * FROM [map].[PersonMap] PM (nolock)

165 записей (сколько и было до этого куска кода)

Я в ауте. Как может LEFT JOIN показать другое число записей?
24 янв 13, 17:28    [13823097]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
Выдаёт 178 записей

И разные результаты в разных запросах являются доказательством того, что скрипт без комнады insert добавляет данные ?
24 янв 13, 17:31    [13823116]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
Как может LEFT JOIN показать другое число записей?

Почему разные запросы должны давать одинаковый результат ?
24 янв 13, 17:32    [13823127]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Glory,

ну я ВОТ сейчас поставил запрос

SELECT COUNT(*)
FROM [map].[PersonMap] PM (nolock)
LEFT JOIN [ws].[Person] WSP (nolock) ON WSP.IdSubj=PM.IdExternal


до и после этого курсора
Ну и запускаю.
Смотрю результат.
До 165
После 178
24 янв 13, 17:35    [13823166]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
Ну и запускаю.
Смотрю результат.
До 165
После 178

Железное доказательство добавления записей именно в вашем скрипте.
24 янв 13, 17:38    [13823184]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
Glory
Member

Откуда:
Сообщений: 104751
Вы меняете поле, по которому происходит связывание таблиц.
И поэтому во второй запрос начинает попадать больше записей.
24 янв 13, 17:39    [13823196]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
.
Guest
...повесить триггер на инсерт и писать себе в лог, кто вставляет
24 янв 13, 17:41    [13823204]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
defragmentator
Glory,

ну я ВОТ сейчас поставил запрос

SELECT COUNT(*)
FROM [map].[PersonMap] PM (nolock)
LEFT JOIN [ws].[Person] WSP (nolock) ON WSP.IdSubj=PM.IdExternal


до и после этого курсора
Ну и запускаю.
Смотрю результат.
До 165
После 178
Ну, дык UPDATE-то выполняется! Условие LEFT JOINа выдаёт другой результат!
На одну запись левой таблицы может же приходиться несколько записей во второй!
24 янв 13, 17:41    [13823211]     Ответить | Цитировать Сообщить модератору
 Re: Туплю с курсором  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Glory
Вы меняете поле, по которому происходит связывание таблиц.
И поэтому во второй запрос начинает попадать больше записей.


Да, согласен.
Вопрос закрыт.
24 янв 13, 17:49    [13823272]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить