从函数执行存储过程

| 我知道这已经被要求死了,而且我知道为什么SQL Server不允许您这样做。 但是,除了使用扩展存储过程之外,还有其他解决方法吗? 而且请不要告诉我将我的函数转换为过程... 因此,我真正要问的是:是否有任何方法可以从Function内部运行存储过程? 编辑: 事实证明:有一种解决方法,但是它太错了,我不会做。 我将其更改为存储过程,然后在其他位置执行它。     
已邀请:
        编辑:我还没有尝试过,所以我不能保证!而且您已经知道您不应该这样做,所以请不要这样做。但... 尝试在这里查看: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外,另一种选择是使用SQLCLR(SQL Server的\“ CLR Integration \”功能)。 SQLCLR选项不仅比其他两种方法更安全,而且还具有潜在的好处,即能够在当前会话中调用存储过程,以便它可以访问任何基于会话的对象或设置,例如: 临时表 临时存储过程 CONTEXT_INFO 这可以通过使用\“ context connection = true; \”作为ConnectionString来实现。请记住,对T-SQL用户定义函数施加的所有其他限制都将得到执行(即不会产生任何副作用)。 如果您使用常规连接(即不使用上下文连接),则它将作为独立调用运行,就像使用OPENQUERY和xp_cmdshell方法时一样。 但是,请记住,如果您要使用一个在影响多于一行的语句中调用存储过程的函数(无论您使用的是哪种3种指定方法),那么就不能期望该行为运行一次每行。正如@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()
它不像ѭ4那样令人恐惧,但对实际使用也有太多影响。     
        我已经找到解决这个问题的方法。我们可以在存储过程中使用\“ rendered \” sql构建Function或View,然后可以正常执行该存储过程。 1.创建另一个存储过程
CREATE PROCEDURE [dbo].[usp_FunctionBuilder]
DECLARE @outerSql VARCHAR(MAX)
DECLARE @innerSql VARCHAR(MAX)
2.构建要在函数中执行的动态SQL(示例:您可以使用循环和并集,可以读取另一个Sproc,使用条件SQL的if语句和参数等)
SET @innerSql = \'your sql\'
3.将@innerSql包装在create function语句中,并定义您在@innerSql中使用的所有外部参数,以便可以将它们传递到生成的函数中。
SET @outerSql = \'CREATE FUNCTION [dbo].[fn_GeneratedFunction] ( @Param varchar(10))
RETURNS TABLE
AS
RETURN
\' + @innerSql;


EXEC(@outerSql)
这只是伪代码,但是该解决方案解决了许多问题,例如链接服务器的限制,参数,函数中的动态sql,动态服务器/数据库/表名,循环等。 您将需要对其进行调整,(例如:在函数中更改return)     

要回复问题请先登录注册