我有一个链接服务器,用于从具有预定sql作业代理的特定组织单元中提取用户详细信息。
创建用于保存用户详细信息的表有一个ObjectGUID编号的列,类型定义为varbinary(50)(我不知道为什么..)。
该进程通过比较已保存的Users表的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,但它仍然不起作用。
知道如何进行比较?
更新
CREATE VIEW [dbo].[ActiveDirectoryUsers] AS
SELECT "SAMAccountName" AS sAMAccountName, "mail" AS Email,
"objectGUID" AS objectGUID
FROM OpenQuery(ADSI, 'SELECT SAMAccountName, mail, objectGUID
FROM ''ldapconnectionstring.com''')
Users表中的objectGUID示例
0x1DBCC071C69C8242B4895D42750969B1
答案 0 :(得分:1)
您不应该将varbinary
强制转换为特定的,以便能够在WHERE
子句中使用它。
您的问题是,您使用的NOT IN
值存在NULL
。
尝试先按原样执行我的代码(它将返回1行),然后取消注释NULL
值插入并再次执行。
这次你会获得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);
要解决您的问题,请尝试使用NOT EXISTS
代替NOT IN
,如下所示:
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 );