Sql 如何使用ADSI OPENQUERY连接表
我有这个交易表记录,下面我需要从ADSI获取用户的电子邮件地址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
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'' '')'