Sql server SQL Server作业中的布尔表达式

Sql server SQL Server作业中的布尔表达式,sql-server,database,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

我继承了一个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;
它正在将“person”数据从FirstDB更新到OtherDB。
PersonId
列是
bigints
且不为空。各种“日期”列的类型为
datetime
,可以为空。其他列都是
varchar
,可以为空

我学到的是,在
where
子句中,如果布尔运算符的任一侧或两侧出现NULL,则结果是未定义的。基本上,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, '');
这在常规查询窗口中工作,但在作业中失败。错误是:

在预期条件的上下文中指定的非布尔型表达式,靠近“或”。[SQLSTATE 42000](错误4145)。步骤失败了

我看不出有什么问题。我错过了什么

编辑


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

您是如何将步骤添加到作业的?我想知道您使用的脚本是否逃过了所有双撇号,现在正在尝试评估

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

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

您是如何将步骤添加到作业的?我想知道您使用的脚本是否逃过了所有双撇号,现在正在尝试评估

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

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

您是如何将该步骤添加到作业的?我想知道您使用的脚本是否逃过了所有双撇号,现在它正在尝试计算ISNULL(Person.LastName,')!=ISNULL(P.LastName“”)-粗体部分是一个简单的字符串文字,而不是空字符串和与另一个表达式的比较。这绝对是问题所在。非常感谢。乐于添加有关您如何添加作业/步骤的详细信息,以便其他人可能会对相同的方法持谨慎态度。是否生成动态SQL来添加作业步骤,将T-SQL传递给Powershell…?如何将步骤添加到作业?我想知道您使用的脚本是否逃过了所有双撇号,现在它正在尝试计算ISNULL(Person.LastName,')!=ISNULL(P.LastName“”)-粗体部分是一个简单的字符串文字,而不是空字符串和与另一个表达式的比较。这绝对是问题所在。非常感谢。乐于添加有关您如何添加作业/步骤的详细信息,以便其他人可能会对相同的方法持谨慎态度。您是否生成了动态SQL来添加作业步骤,将T-SQL传递给Powershell,…?正如Aaron所建议的,我只是将Drop&Create查询窗口复制到我编辑和测试的其他查询窗口。然后,我只是将C7P的编辑版本返回到作业中,忘记引用单引号。正如Aaron所建议的,我只是将Drop&Create查询窗口复制到我编辑和测试的其他查询窗口。然后,我只是把C7P的编辑版本放回作业中,忘记引用单引号。