【问题标题】:How to Join Table with ADSI OPENQUERY如何使用 ADSI OPENQUERY 连接表
【发布时间】:2015-08-28 07:51:22
【问题描述】:

我有这张交易表Record,下面我需要从 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 中无法使用动态查询

只有函数和一些扩展存储过程可以在函数内执行。

感谢任何帮助。

谢谢!

【问题讨论】:

    标签: sql sql-server tsql active-directory


    【解决方案1】:

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

    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;
    

    不要像这样连接@sql 字符串:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多