以前我也碰到过这样的问题,看看你的select ItemB from SqlB.DataB.TableB 
是不是有 null 值,in 相当于等号,null 不是0不是空 不能与其它值比较,所以即使有符合条件的记录也不会出来。
可用在执行前加上set ansi_nulls off 记得结束后 用set ansi_nulls on 恢复,免得影响其它,或者 用 isnull 转化一下,select * from TableA where ItemA 
not in (select isnull(ItemB,'') from SqlB.DataB.TableB)

解决方案 »

  1.   

    若要确定表达式是否为 NULL,请使用 IS NULL 或 IS NOT NULL,而不要用比较运算符(例如 = 或 !=)。如果有一个参数为 NULL 或两个参数都为 NULL,那么比较运算符返回 UNKNOWN。
    in 相当于 =SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍返回零行。当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中含有空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中含有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有非 XYZ 值和非 NULL的行。