从函数执行存储过程

Smu*_*mur 48 sql sql-server stored-procedures sql-server-2005 user-defined-functions

我知道这已被要求死亡,我知道为什么SQL Server不允许你这样做.

但除了使用扩展存储过程之外,还有其他解决方法吗?

请不要告诉我将我的功能转换为程序...

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

编辑:

有点证明:有一种解决方法,但它是如此错误,我不会这样做.我要将其更改为存储过程并在其他地方执行.

Tom*_*ler 26

编辑:我没试过这个,所以我不能保证!你已经知道你不应该这样做,所以请不要这样做.但...

试试这里: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
Run Code Online (Sandbox Code Playgroud)

  • 当我读到这篇文章时,我的一部分时间流下了.虽然我的一大部分人在恐怖中尖叫着,在房间里跑来跑去像鸡一样唧唧喳喳...说真的,如果你想为任何一个人提供一个可用,友好的环境,不要找到能够产生副作用的黑客比明天更长...... (10认同)
  • 而且人们会嘲笑这些评论.保持它. (8认同)
  • 我?冷静!?我很平静!看,我几乎不发抖......你是什么意思像鸡一样唧唧喳喳?我告诉你不是我!不是我!停止在我这样做! (3认同)
  • 如果 OP 这样做,你想让我被解雇!?太狠了 ;( (2认同)

Mat*_*lie 14

不允许函数产生副作用,例如改变表格内容.

存储过程是.

如果一个函数称为存储过程,该函数将变得能够产生副作用.


所以,抱歉,但不,你不能从函数调用存储过程.

  • @LukaRamishvili - 我会在那里稍微反驳你."吸烟导致癌症,因为吸烟是carcenogenic"确实是循环的.但是`函数不能调用StoredProcedures因为函数不允许导致副作用`不是循环的.可能有一个*额外的问题:"为什么FN不能引起副作用?"但这确实是一个额外的问题."为什么?"可以被问到任何级别,最后详细说明了优化器的设计和实现.在我看来,这不是一个论坛. (6认同)
  • 你的答案缺乏解释.重点是*为什么*函数不被允许,你只是将同一个句子改为三种不同的形式.如果它是关于引用透明度,那么*state*that.如果它是关于效率,*州*那,但不要让人们疑惑. (3认同)
  • 鉴于其他答案中显示的 3 种方法,这个答案绝对是错误的。一个人是否应该这样做是单独的,这取决于上下文(即,函数是像“SET @Variable = function”中那样运行一次,还是可能运行多次,因为它是一个查询的一部分,可以看到许多可能的行,即使它只返回一行)。另外,“如果一个函数调用存储过程,该函数就会产生副作用”这一说法也是不正确的,因为 SQL Server 只能阻止那些禁止的操作,就像从 SQLCLR 函数调用过程时所做的那样。 (2认同)