Sql server 如何比较where子句中的varbinary数据类型
我有一个链接服务器,创建该服务器是为了使用计划的sql作业代理从特定的组织单位获取用户详细信息 创建该表是为了保存用户详细信息,其中有一列表示ObjectGUID编号,该类型定义为varbinary(50)(我不知道为什么…) 该过程通过比较已保存用户表中的ObjectGUID编号来检查是否有新用户,如果有新编号,则在表中插入新用户 然而,我注意到,这些比较实际上并没有起到很好的作用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
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或使用不存在的解决方案之间有什么区别吗?可能在很久以前就有区别了,但现在服务器足够聪明,可以为这两种情况生成相同的执行计划,因此它完全知道需要什么。也许“不存在”在某种意义上更直观,它对应于你想要什么的英文描述