如何比较where子句中的varbinary数据类型
问题描述:
我有一个链接服务器,用于从具有调度的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
答
你不应该投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);
请更新您的问题与字段和他们的类型。什么是varbinary(50),dbo.Users.UserGUID?或[dbo]。[ActiveDirectoryUsers] .objectGUID? Od都是? – sepupic
如果'dbo.ActiveDirectoryUsers.objectGUID'是'varbinary(50)',是否也是'dbo.Users.UserGUID'?或者它是GUID的字符串表示形式? – Ashigore
ActiveDirectoryUsers.objectGUID未定义。这是一个观点。我添加了视图创建脚本。但是,当我看着视野下的SQL管理工作室列,我可以看到这种类型的objectGUID是VARBINARY(4000)。 – akd