从函数执行存储过程

我知道这已经被要求死亡,我知道为什么SQL Server不会让你这样做。

但有没有解决方法,除了使用扩展存储过程?

请不要告诉我把我的function转换成一个过程…

所以我真正要问的是:有没有办法从一个函数内运行存储过程?

编辑:

点certificate:有一个方法,但它是如此错误,我不会这样做。 我要把它改成一个存储过程并在其他地方执行。

编辑:我没有尝试过,所以我不能担保! 而且你已经知道你不应该这样做,所以请不要这样做。 但…

试试看这里: http : //sqlblog.com/blogs/denis_gobo/archive/2008/05/08/6703.aspx

关键是我已经试图调整你的目的这一点:

 DECLARE @SQL varchar(500) SELECT @SQL = 'osql -S' +@@servername +' -E -q "exec dbName..sprocName "' EXEC master..xp_cmdshell @SQL 

函数不允许有改变表格内容等副作用。

存储过程是。

如果一个叫做存储过程的函数,函数会变得有副作用。

所以,对不起,但是不能,你不能从函数调用存储过程。

除了使用OPENQUERY和xp_cmdshell之外,另一种select是使用SQLCLR(SQL Server的“CLR集成”function)。 SQLCLR选项不仅比其他两种方法更安全,而且还能够调用当前会话中的存储过程以便它可以访问任何基于会话的对象或设置,例如:

  • 临时表
  • 临时存储过程
  • CONTEXT_INFO

这可以通过使用“上下文连接=真实”来实现 作为ConnectionString。 请记住,对T-SQL用户定义函数的所有其他限制都将被强制执行(即不能有任何副作用)。

如果使用常规连接(即不使用上下文连接),则它将作为独立调用进行操作,就像使用OPENQUERY和xp_cmdshell方法一样。

但是请记住,如果您将在影响多于一行的语句中使用调用存储过程的函数(无论您使用哪三种方法中的哪一种),那么行为不能期望运行一次每行。 正如@MartinSmith在@MatBailie的回答中提到的那样,查询优化器并不保证函数执行的时间或数量。 但是如果你在SET @Variable = function();中使用它, 语句或SELECT * FROM function(); 查询,那么它应该没问题。

在下面的文章(我写到)中显示了一个使用.NET / C#SQLCLR用户定义函数执行存储过程的示例:

SQLCLR级别2的阶梯:样本存储过程和函数

这是另一种可能的解决方法:

 if exists (select * from master..sysservers where srvname = 'loopback') exec sp_dropserver 'loopback' go exec sp_addlinkedserver @server = N'loopback', @srvproduct = N'', @provider = N'SQLOLEDB', @datasrc = @@servername go create function testit() returns int as begin declare @res int; select @res=count(*) from openquery(loopback, 'exec sp_who'); return @res end go select dbo.testit() 

它不像xp_cmdshell那么可怕,但是对实际使用也有太多的含义 。