我已经继承了执行几项任务的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代理”下拉列表。我打开“工作”,找到了我要找的工作。我右键单击作业名称,然后选择“脚本作业为”->“拖放并创建为”->“新查询窗口”。从那里,我将相关部分复制到新的查询窗口,并在必要时对其进行了修改和测试。然后,我只是将工作部分复制并粘贴回上方的工作窗口中-完全忘记了在必要时将单引号加倍。
答案 0 :(得分:2)
您如何将步骤添加到工作中?我想知道您使用的脚本是否转义了所有双撇号,并且现在尝试评估
WHERE ISNULL(Person.LastName, ') != ISNULL(P.LastName, ')
------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^
这是“足够有效”的语法。突出显示的部分是简单的字符串文字,而不是空字符串,并且是与另一个表达式的比较。