2017-10-09 82 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