Sql server 如何比较where子句中的varbinary数据类型

Sql server 如何比较where子句中的varbinary数据类型,sql-server,active-directory,Sql Server,Active Directory,我有一个链接服务器,创建该服务器是为了使用计划的sql作业代理从特定的组织单位获取用户详细信息 创建该表是为了保存用户详细信息,其中有一列表示ObjectGUID编号,该类型定义为varbinary(50)(我不知道为什么…) 该过程通过比较已保存用户表中的ObjectGUID编号来检查是否有新用户,如果有新编号,则在表中插入新用户 然而,我注意到,这些比较实际上并没有起到很好的作用 SELECT tbl.objectGUID AS UserGUID FROM [dbo].[ActiveDi

我有一个链接服务器,创建该服务器是为了使用计划的sql作业代理从特定的组织单位获取用户详细信息

创建该表是为了保存用户详细信息,其中有一列表示ObjectGUID编号,该类型定义为varbinary(50)(我不知道为什么…)

该过程通过比较已保存用户表中的ObjectGUID编号来检查是否有新用户,如果有新编号,则在表中插入新用户

然而,我注意到,这些比较实际上并没有起到很好的作用

SELECT 
tbl.objectGUID AS UserGUID 
FROM [dbo].[ActiveDirectoryUsers] tbl
WHERE tbl.objectGUID NOT IN (SELECT UserGUID FROM dbo.Users)
创建新用户时,新用户将出现在ActiveDirectoryUsers视图中

但当添加where子句以将结果与Users表进行比较时,结果总是空的。看起来我需要将varbinary转换为varchar,然后进行比较。我试图将varbinary转换为varchar和uniqueidentifier,但仍然不起作用

你知道我该怎么做比较吗

更新

Users表中的objectGUID示例

0x1DBCC071C69C8242B4895D427500969B1


您不应该将
varbinary
强制转换为smth special,以便能够在
WHERE
子句中使用它。 您的问题是在存在
NULL
值的地方使用
NOT IN

尝试先按原样执行我的代码(它将返回1行),然后取消注释
NULL
value insert并再次执行它。 这次您将得到0行:

 declare @t1 table (guid varbinary(50))
 insert into @t1
 values(0x1DBCC071C69C8242B4895D42750969B1)--, (null);

 declare @t2 table (guid varbinary(50))
 insert into @t2
 values(0x1DBCC071C69C8242B4895D42750969B1), (0x1DBCC071C69C8242B4895D42750969B2);

 select *
 from @t2 t2
 where t2.guid not in (select guid from @t1);
要解决问题,请尝试使用
不存在
而不是
不存在
,如下所示:

 select *
 from @t2 t2
 where not exists (select * 
                   from @t1 t1
                   where t1.guid = t2.guid);
SELECT tbl.objectGUID AS UserGUID 
FROM [dbo].[ActiveDirectoryUsers] tbl
WHERE not exists (SELECT * 
                  FROM dbo.Users u
                  where u.UserGUID = tbl.objectGUID );
在您的情况下,代码应如下所示:

 select *
 from @t2 t2
 where not exists (select * 
                   from @t1 t1
                   where t1.guid = t2.guid);
SELECT tbl.objectGUID AS UserGUID 
FROM [dbo].[ActiveDirectoryUsers] tbl
WHERE not exists (SELECT * 
                  FROM dbo.Users u
                  where u.UserGUID = tbl.objectGUID );

请使用字段及其类型更新您的问题。什么是varbinary(50),dbo.Users.UserGUID?或[dbo].[ActiveDirectoryUsers].objectGUID?如果
dbo.ActiveDirectoryUsers.objectGUID
varbinary(50)
,那么
dbo.Users.UserGUID也是
?或者它是GUID的字符串表示形式?未定义ActiveDirectoryUsers.objectGUID。这是一种观点。我添加了视图创建脚本。但是当我在Sql management studio中查看列下的视图时,我可以看到objectGUID的类型是varbinary(4000)?瓦查尔在哪里?@sepupic没有瓦查尔。我只是问如何让查询工作。当我在varbinary之间进行比较时,结果是错误的。即使objectGuid不在Users表中,结果也不会显示user.checking for null修复了该问题。检查null或使用不存在的解决方案之间有什么区别吗?可能在很久以前就有区别了,但现在服务器足够聪明,可以为这两种情况生成相同的执行计划,因此它完全知道需要什么。也许“不存在”在某种意义上更直观,它对应于你想要什么的英文描述