Я унаследовал «задание» SQL Server, которое выполняет несколько вещей.Есть два «шага», и у каждого есть несколько операторов, один из которых:
UPDATE Person
SET Person.LastName = P.LastName,
Person.FirstName = P.FirstName,
Person.MiddleName = P.MiddleName,
Person.EmailAddress = P.EmailAddress,
Person.StartDate = P.StartDate,
Person.EndDate = P.EndDate
FROM OtherDB.dbo.Person Person
INNER JOIN FirstDB.dbo.Persons AS P ON P.PersonId = Person.PersonId
WHERE Person.LastName != P.LastName
OR Person.FirstName != P.FirstName
OR Person.MiddleName != P.MiddleName
OR Person.EmailAddress != P.EmailAddress
OR Person.StartDate != P.StartDate
OR Person.EndDate != P.EndDate;
Он обновляет данные о человеке из FirstDB в OtherDB.Столбцы PersonId
имеют значение bigints
и не являются нулевыми.Различные столбцы даты имеют тип datetime
и могут иметь значение NULL.Все остальные столбцы varchar
и могут иметь значение NULL.
Я узнал, что в предложении where
, если NULL появляется с одной или с обеих сторон логического оператора, результат не определен.По сути, NULL не может быть ни равным, ни неравным NULL.Похоже, что то же самое относится к NULL и любому другому ненулевому значению.
Итак, я подумал:
UPDATE Person
SET Person.LastName = P.LastName,
Person.FirstName = P.FirstName,
Person.MiddleName = P.MiddleName,
Person.EmailAddress = P.EmailAddress,
Person.StartDate = P.StartDate,
Person.EndDate = P.EndDate
FROM OtherDB.dbo.Person Person
INNER JOIN FirstDB.dbo.Persons AS P ON P.PersonId = Person.PersonId
WHERE ISNULL(Person.LastName, '') != ISNULL(P.LastName, '')
OR ISNULL(Person.FirstName, '') != ISNULL(P.FirstName, '')
OR ISNULL(Person.MiddleName, '') != ISNULL(P.MiddleName, '')
OR ISNULL(Person.EmailAddress, '') != ISNULL(P.EmailAddress, '')
OR ISNULL(Person.StartDate, '') != ISNULL(P.StartDate, '')
OR ISNULL(Person.EndDate, '') != ISNULL(P.EndDate, '');
Это работает в обычном окне запроса, но не в работе.Ошибка:
Выражение не-логического типа, указанное в контексте, где ожидается условие, около 'ИЛИ'.[SQLSTATE 42000] (ошибка 4145).Шаг не пройден.
Я не вижу проблемы.Чего мне не хватает?
Редактировать
В соответствии с просьбой, для других в этой ситуации: я отредактировал это задание с помощью SQL Server Management Studio.Я открыл соединение с моей целевой БД, а затем открыл раскрывающийся список «Агент SQL Server» под соединением.Я открыл «Вакансии» и нашел работу, которую искал.Я щелкнул правой кнопкой мыши по названию задания и выбрал «Сценарий задания как» -> «Удалить и создать» -> «Новое окно запроса».Оттуда я скопировал соответствующие разделы в новые окна запросов, где я изменил и протестировал их по мере необходимости.Затем я просто скопировал и вставил рабочие разделы обратно в окно задания выше - ПОЛНОСТЬЮ забыв удвоить одинарные кавычки, где это необходимо.