Tsql 将sql表与guid上的active directory用户连接时遇到棘手的问题

Tsql 将sql表与guid上的active directory用户连接时遇到棘手的问题,tsql,active-directory,openquery,Tsql,Active Directory,Openquery,好的,我们在SQL中有一些表,它们通过active directory中的Guid来标识用户。起初,开发团队只想在sql中镜像用户群,但经理坚持我们将其保留在active directory中。因此,无论如何,我们尝试执行的操作之一是从SQL中获取一个表,该表包含用户的Guid和一些其他信息,并将其连接到从openquery到AD生成的表 问题是,如果用户从广告中删除,则打开的查询会呕吐。我假设这是因为我们试图导航到active directory中不存在的条目,并且由于它不是一个实际的查询(本

好的,我们在SQL中有一些表,它们通过active directory中的Guid来标识用户。起初,开发团队只想在sql中镜像用户群,但经理坚持我们将其保留在active directory中。因此,无论如何,我们尝试执行的操作之一是从SQL中获取一个表,该表包含用户的Guid和一些其他信息,并将其连接到从openquery到AD生成的表

问题是,如果用户从广告中删除,则打开的查询会呕吐。我假设这是因为我们试图导航到active directory中不存在的条目,并且由于它不是一个实际的查询(本质上是一个索引),所以它爆炸了。这是我们用来拉用户的ldap字符串

LDAP://<GUID=(guid here)>
LDAP://
或者更具体地说,类似于

SELECT * from openquery(ADSI, '
   SELECT displayName, mail
   FROM LDAP://<GUID=(userGuid)>
')
从openquery(ADSI)中选择*
选择displayName,mail
从LDAP://
')
现在,如果这是一个查询而不是一个索引,或者在本例中是一个“过滤器”,那么(objectGuid=x)将不返回任何结果,而不是抛出一个错误。但这里的问题是objectGuid并不是作为guid返回SQL,而是作为二进制0x102938102938或一些垃圾返回。现在,我想把Guid转换成十六进制,然后再转换成二进制,然后尝试用它来查询AD,但我甚至不知道从哪里开始

因此,我想这里的最终问题是:如何根据guid查询用户的active directory,如果guid不存在,它不会抛出错误?这样我可以将它连接到sql查询吗?这需要在T-SQL中实现,而不是在使用.net DirectoryServices helpers的代码中实现

我很抱歉,如果这看起来像是胡思乱想,我只是想把我们一直在处理的事情放在这里。欢迎提供任何意见,包括采取不同路线的建议。TIA

所以有几件事:

至于格式化GUID,您需要执行
转换(您的列为varchar(38))
。此链接解释了工作的格式-。我不知道(如果/如何)您可以立即告诉SQL如何格式化强制转换的值。您可能需要在线挖掘一个函数来为您进行GUID格式化


我建议,对于连接,您可以看看是否可以在表值函数中执行AD查找,您可以在那里捕获错误,不返回任何行,或者以这种方式返回行并连接

结果证明tvf正在破坏openquery。openquery只是一个大麻烦。太多的动态sql:S