【问题标题】:How do I use a stored procedure in a function or query?如何在函数或查询中使用存储过程?
【发布时间】: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


【解决方案1】:

问你一个问题。你是什​​么意思你“不能在查询中使用 EXEC”?您可以在存储过程中使用各种形式的 EXEC。我们服务器上的安全性如此之高,以至于我无法轻松测试您正在尝试做的事情,但让我感到震惊的一件事是

EXEC sp_executesql @sql

可能

EXEC (@sql)

我知道它适用于大多数类型的查询,还没有用 openrowset 尝试过

【讨论】:

  • 我尝试在函数中使用它。但是 SQL 抛出了一个错误,说它不能用于我在上面的问题中发布的错误消息的函数中。只能使用扩展过程 (CLR)。但是 SQL 环境不支持我需要使用的 System.DirectoryServices。
  • 好吧,我误会了。 SQL Server 中没有直接的方法来执行 Select * from usp_QueryADSI 之类的操作。如果是我,我会把它放在临时表或表变量中。如果您不想这样做,您可以尝试在最终查询中使用 OPENQUERY 而不是 exec。不知道它是否会起作用,但这个问题的第二个答案对此有所了解:stackoverflow.com/questions/18103657/…
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
相关资源
最近更新 更多