2017-10-09 47 views
-1

我有一个链接服务器,用于从具有调度的SQL作业代理的特定组织单元中提取用户详细信息。如何比较where子句中的varbinary数据类型

该表创建用于保存用户详细信息有一列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,但仍然无效。

任何想法我会怎么做比较?

更新

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''') 

在用户表中能够使用的objectGUID的例子

0x1DBCC071C69C8242B4895D42750969B1

+0

请更新您的问题与字段和他们的类型。什么是varbinary(50),dbo.Users.UserGUID?或[dbo]。[ActiveDirectoryUsers] .objectGUID? Od都是? – sepupic

+0

如果'dbo.ActiveDirectoryUsers.objectGUID'是'varbinary(50)',是否也是'dbo.Users.UserGUID'?或者它是GUID的字符串表示形式? – Ashigore

+0

ActiveDirectoryUsers.objectGUID未定义。这是一个观点。我添加了视图创建脚本。但是,当我看着视野下的SQL管理工作室列,我可以看到这种类型的objectGUID是VARBINARY(4000)。 – akd

回答

1

你不应该投varbinary到SMTH特别它在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); 
+0

修复了问题。检查null还是使用不存在的解决方案有任何区别? – akd

+1

也许以前有过不同的想法,但现在服务器足够聪明,可以为这两种情况制定相同的执行计划,因此它完全意识到它的要求。也许NOT EXISTS在意义上更直观,它对应于你想要的英文描述 – sepupic