Булевы выражения в заданиях SQL Server - PullRequest
0 голосов
/ 25 октября 2018

Я унаследовал «задание» 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» под соединением.Я открыл «Вакансии» и нашел работу, которую искал.Я щелкнул правой кнопкой мыши по названию задания и выбрал «Сценарий задания как» -> «Удалить и создать» -> «Новое окно запроса».Оттуда я скопировал соответствующие разделы в новые окна запросов, где я изменил и протестировал их по мере необходимости.Затем я просто скопировал и вставил рабочие разделы обратно в окно задания выше - ПОЛНОСТЬЮ забыв удвоить одинарные кавычки, где это необходимо.

1 Ответ

0 голосов
/ 25 октября 2018

Как вы добавили шаг к работе?Интересно, если используемый вами скрипт избежал всех ваших двойных апострофов, и теперь он пытается оценить

WHERE ISNULL(Person.LastName, ') != ISNULL(P.LastName, ')
------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^

Это "достаточно допустимый" синтаксис.Выделенная часть представляет собой простой строковый литерал, а не пустую строку и сравнение с другим выражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...