Sql 如何使用ADSI OPENQUERY连接表

Sql 如何使用ADSI OPENQUERY连接表,sql,sql-server,tsql,active-directory,Sql,Sql Server,Tsql,Active Directory,我有这个交易表记录,下面我需要从ADSI获取用户的电子邮件地址 ID DisplayName 1 Surname,User1 [Department] 2 Surname,User2 [Department] ADSI查询: DECLARE @sql nvarchar(MAX) DECLARE @Mail varchar(255) set @sql = 'SELECT TOP 1 @Mail = mail FROM openquery(ADSI ,'' SELECT

我有这个交易表记录,下面我需要从ADSI获取用户的电子邮件地址

ID DisplayName 
1  Surname,User1 [Department]
2  Surname,User2 [Department]
ADSI查询:

DECLARE @sql nvarchar(MAX)    
DECLARE @Mail varchar(255) 


set @sql = 'SELECT TOP 1 @Mail = mail
FROM openquery(ADSI ,''    
SELECT  Name, displayName,givenname,distinguishedName, SAMAccountName ,mail    
FROM ''''LDAP://DC=Domain,DC=org'''' WHERE displayName = '''''+@DisplayName+'''''    
'')'    
--print @sql    
 exec sp_executesql @sql,N'@Mail varchar(255)  OUTPUT',@Mail OUTPUT

SELECT @Mail   
期望输出:

ID DisplayName                 EmailAdrress         
1  Surname,User1 [Department]  User1.Surname@test.com
2  Surname,User2 [Department]  User2.Surname@test.com
我创建了UDF,但出现了一个错误,在UDF中不能使用动态查询

只有函数和一些扩展存储过程才能从函数中执行

感谢您的帮助


谢谢

我认为您不会避免循环/光标:

CREATE TABLE #temp(row_id INT IDENTITY(1,1), Id <type>, DisplayName <type>, EmailAddress <type> NULL);

INSERT INTO #temp(Id, DisplayName)
SELECT Id, DisplayName
FROM Record;

DECLARE @index INT = 1,
        @total INT = (SELECT * FROM #temp),
        @sql   NVARCHAR(MAX),    
        @Mail  VARCHAR(255),
        @DisplayName NVARCHAR(100);

WHILE (@index <= @total)
BEGIN
    SELECT  @DisplayName = DisplayName
    FROM #temp
    WHERE [row_id] = @index;

    SET @sql = 
        N'SELECT TOP 1 @Mail = mail
          FROM openquery(ADSI ,''    
          SELECT  Name, displayName,givenname,distinguishedName, SAMAccountName ,mail    
          FROM ''''LDAP://DC=Domain,DC=org'''' WHERE displayName = ''@DisplayName'' '')';    

    EXEC [dbo].[sp_executesql] 
          @sql
         ,N'@DisplayName NVARCHAR(100),
            @Mail VARCHAR(255)  OUTPUT'
         ,@DisplayName                /* Added explicitly parameters */
         ,@Mail OUTPUT;

   UPDATE #temp
   SET EmailAddress = @Mail
   WHERE row_id = @index;

   SET @index += 1;
END

SELECT 
   Id,
   DisplayName,
   EmailAddress
FROM #temp;
'... WHERE displayName = '''''+@DisplayName+'''''  '')'  

/* Use explicit parameter for sp_executesql */
'... WHERE displayName = ''@DisplayName'' '')'