SQL Server作业中的布尔表达式

时间:2018-10-25 16:42:17

标签: sql-server database

我已经继承了执行几项任务的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,并且不为null。各种“日期”列的类型为datetime,可以为NULL。其他列均为varchar,可以为NULL。

我了解到的是,在where子句中,如果布尔运算符的任一侧或两侧出现NULL,则结果是不确定的。基本上,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, '');

这在常规查询窗口中有效,但工作失败。错误是:

  

在需要条件的上下文中在“ OR”附近指定的非布尔类型的表达式。 [SQLSTATE 42000](错误4145)。步骤失败。

我没看到问题。我想念什么?

修改

根据要求,对于这种情况下的其他人:我使用SQL Server Management Studio编辑了此作业。我打开了到目标数据库的连接,然后打开了该连接下的“ SQL Server代理”下拉列表。我打开“工作”,找到了我要找的工作。我右键单击作业名称,然后选择“脚本作业为”->“拖放并创建为”->“新查询窗口”。从那里,我将相关部分复制到新的查询窗口,并在必要时对其进行了修改和测试。然后,我只是将工作部分复制并粘贴回上方的工作窗口中-完全忘记了在必要时将单引号加倍。

1 个答案:

答案 0 :(得分:2)

您如何将步骤添加到工作中?我想知道您使用的脚本是否转义了所有双撇号,并且现在尝试评估

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

这是“足够有效”的语法。突出显示的部分是简单的字符串文字,而不是空字符串,并且是与另一个表达式的比较。