对标题感到抱歉。我想不出用短句来总结我的问题的方法。
在select语句中,该表有一列Active Directory ID。我需要使用子查询来获取ADID的全名。我想出了以下代码来查询ADSI并得到我需要的东西:
SELECT givenName + ' ' + sn AS fullName
FROM OPENROWSET(
'ADSDSOObject', 'adsdatasource'; 'myDomain\jsmith'; 'myPassword',
'SELECT givenname, sn FROM ''LDAP://my.company.com'' WHERE objectClass = ''user'' AND SAMAccountName = ''stennell''')
这很酷,但我需要参数化ID,密码和SAMAccountName值。由于OPENRECORDSET需要文字字符串,因此无法连接字符串和字符串。参数。我必须使用动态SQL。所以这是新代码:
SET @sql = 'SELECT givenName + '' '' + sn AS fullName ' + 'FROM OPENROWSET(''ADSDSOObject'', ''adsdatasource''; ''US\' + @authADID + '''; ''' + @authPWD + ''',' +
'''SELECT givenName, sn FROM ''''LDAP://us.ups.com'''' WHERE objectClass = ''''user'''' AND SAMAccountName = ''''' + @searchADID + ''''''')'
EXEC sp_executesql @sql
这有效,所以我将其包装到存储过程中。但我不能在查询中使用EXEC。一些谷歌搜索告诉我,我需要将代码放入标量值函数中。所以我试过了,但在尝试创建函数时遇到了这个错误:
只能执行函数和一些扩展存储过程 来自一个函数。
然后更多谷歌搜索告诉我在Visual Studio中创建一个SQL CLR函数。但我没有所有教程告诉我选择的模板(SQL CLR C#用户定义函数)。我安装了SQL Tools for VS,但仍然没有模板。
我需要做这样的事情才能得到我需要的结果:
LEFT OUTER JOIN (SELECT fullName FROM (EXEC usp_queryADSI 'jsmith','myPassword', TIV.UserID)) AS AD
ON TIV.UserID = AD.ADID
显然,这不起作用,因为你不能像那样使用EXEC。但我碰到了一堵砖墙。希望有人可以解释一下。
答案 0 :(得分:0)
给你一个问题。您是什么意思"在查询中不能使用EXEC"?您可以在存储过程中使用各种形式的EXEC。我们服务器上的安全性使得我无法轻松测试您正在尝试做的事情,但有一件事突然出现在我身上
EXEC sp_executesql @sql
可能是
EXEC (@sql)
我知道这适用于大多数类型的查询,并未尝试使用openrowset