如何在SQL Server查询中嵌入变量值

时间:2016-02-11 01:32:14

标签: sql-server sql-server-2012

我需要能够从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的实际值,以便修改后的代码也能正常运行?

谢谢!

2 个答案:

答案 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)