如何在where子句

时间:2017-10-09 12:17:04

标签: sql-server active-directory

我有一个链接服务器,用于从具有预定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

1 个答案:

答案 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 );