Туплю с курсором

defragmentator
Дата: 24.01.2013 17:00:36
В процедуре отрабатывает курсор и каким - то образом умудряется вставлять новые записи, хотя команды 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. : похоже записи в некоторых случаях просто дублируются
iap
Дата: 24.01.2013 17:05:04
defragmentator,

триггер на UPDATE для map.[PersonMap]
iap
Дата: 24.01.2013 17:06:46
И, может быть, эти записи вставляет кто-то другой?
Вы ж это не в курсоре видите,ибо он объявлен как STATIC!
defragmentator
Дата: 24.01.2013 17:07:33
iap,

не, триггера там нет. Есть внешние ключи.
iap
Дата: 24.01.2013 17:07:55
defragmentator,

чуть не забыл! Завязывайте с курсорами. Редко бывают полезны.
defragmentator
Дата: 24.01.2013 17:12:09
iap,

это процедура переноса штатки из 1С в корпоративную систему.
Тут без курсоров никак.
Glory
Дата: 24.01.2013 17:15:01
defragmentator
каким - то образом умудряется вставлять новые записи, хотя команды INSERT внутри нет :

И почему вы тогда решили, что записи именно вставлются и именно в этом коде ?
Вы логируете все добавления что ли ?
defragmentator
Дата: 24.01.2013 17:28:33
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 показать другое число записей?
Glory
Дата: 24.01.2013 17:31:14
defragmentator
Выдаёт 178 записей

И разные результаты в разных запросах являются доказательством того, что скрипт без комнады insert добавляет данные ?
Glory
Дата: 24.01.2013 17:32:02
defragmentator
Как может LEFT JOIN показать другое число записей?

Почему разные запросы должны давать одинаковый результат ?