【发布时间】:2015-02-04 01:46:36
【问题描述】:
对不起标题。我想不出一句话来概括我的问题。
在 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# 用户定义函数)。我已经安装了 VS 的 SQL 工具,但仍然没有模板。
我需要做这样的事情来获得我需要的结果:
LEFT OUTER JOIN (SELECT fullName FROM (EXEC usp_queryADSI 'jsmith','myPassword', TIV.UserID)) AS AD
ON TIV.UserID = AD.ADID
显然,这是行不通的,因为您不能像那样使用 EXEC。但我碰上了一堵砖墙。希望有人能解释一下。
【问题讨论】:
-
如果您想在
select中使用结果,请考虑将存储过程重写为函数。 -
我做到了。我在第二个代码块下提到了这一点。但它也不起作用,因为我必须在 OPENROWSET 中使用动态 sql,并且该函数不允许使用 EXEC。
-
您能否将您的流程分成两步,第一步将您的数据放入暂存表,第二步调用可以左连接到该表的 SP?
-
是的,这就是我目前正在尝试做的事情。我发现我无法创建 CLR 程序集,因为 SQL 环境不支持 System.DirectoryServices 程序集。这不是一回事,而是另一回事。
标签: sql sql-server function stored-procedures sqlclr