我需要能够从SQL Server查询Active Directory - 请参阅 https://www.mssqltips.com/sqlservertip/2580/querying-active-directory-data-from-sql-server/
以下运行良好:
DECLARE @eid nvarchar(5)
DECLARE @username nvarchar(5)
SET @eid='123'
SELECT @username=sAMAccountName FROM OpenQuery(ADSI,'SELECT sAMAccountName, employeeID FROM ''LDAP://mydomain.com/DC=mydomain,DC=com'' WHERE objectClass = ''User'' AND employeeID=123')
PRINT @username
如何将硬编码的123值替换为@eid
的实际值,以便修改后的代码也能正常运行?
谢谢!
答案 0 :(得分:0)
令人讨厌的是,您必须提前构建SQL字符串以向其中添加参数值,然后使用该字符串执行OpenQuery。您必须像动态查询EXEC sp_executeSQL ...
以下是我提出的建议:
DECLARE @eid nvarchar(5), @username nvarchar(5), @Query nvarchar(MAX)
SELECT @eid='123'
SELECT @Query = N'SELECT sAMAccountName FROM OpenQuery(ADSI, ''SELECT sAMAccountName, employeeID FROM ''''LDAP://mydomain.com/DC=mydomain,DC=com'''' WHERE objectClass = ''''User'''' AND employeeID=' + @eid + ''')'
SELECT @Query
EXEC sp_executeSQL @Query, @username OUTPUT
PRINT @username
我可能没有正确的输出。您拥有的另一个选项是将EXEC sp_executeSQL
的输出插入到临时表中,然后从该值中选择用户名。有关详细信息,请参阅this question。
另一个选项(也可能是最简单的选项)是将WHERE
移到开放查询之外并在得到结果后过滤:
DECLARE @eid nvarchar(5), @username nvarchar(5), @Query nvarchar(MAX)
SELECT @eid='123'
SELECT @username = sAMAccountName--, employeeID
FROM OpenQuery(AD, 'SELECT sAMAccountName, employeeID FROM ''LDAP://mydomain.com/DC=mydomain,DC=com'' WHERE objectClass = ''User''')
WHERE employeeID = @eid
PRINT @username
答案 1 :(得分:0)
我知道这是一个老问题,但这里有一种处理输出值的方法(因为您将只返回 1 个值):
DECLARE @eid nvarchar(5), @username nvarchar(50), @Query nvarchar(MAX)
SET @Query = '(SELECT @username = sAMAccountName FROM OpenQuery(ADSI,''SELECT sAMAccountName, employeeID FROM ''LDAP://mydomain.com/DC=mydomain,DC=com'' WHERE objectClass = ''User'' AND employeeID=' + @eid +') AS tblADSI)'
EXEC sp_executesql @Query , N'@username nvarchar(50) out', @username out
SELECT @username As Outputs
这将在变量@username 中分配 OpenQuery 执行的结果。
我们在 MSSQL 2012 中测试了存储过程,但应该适用于 MSSQL 2008+。
Microsoft 表示 sp_executesql(Transact-SQL):适用于:SQL Server(SQL Server 2008 到当前版本)、Windows Azure SQL 数据库(初始版本到当前版本)。 (http://msdn.microsoft.com/en-us/library/ms188001.aspx)