用户在存储过程中定义函数

Posted

技术标签:

【中文标题】用户在存储过程中定义函数【英文标题】:User define function with in stored procedure 【发布时间】:2010-03-24 05:00:27 【问题描述】:

我们能否在存储过程中创建用户定义函数,然后在存储过程结束时我们需要删除该自定义用户定义函数。

【问题讨论】:

这看起来像:Creating a User Defined function in Stored Procedure in SQL 2005 【参考方案1】:

你可以,但它可能会变得混乱。

看看sp_executesql。这将允许您运行任意 SQL,包括 DDL。以这种方式创建和使用 UDF 似乎有点危险——您需要确保与竞争线程没有任何名称冲突,并且无法获得任何类型的查询优化。

我会仔细检查您的设计,确保没有其他解决方案!

【讨论】:

【参考方案2】:

动态 SQL 是唯一的方法。

ALTER PROC ...
AS
...
EXEC ('CREATE FUNCTION tempFunc...')
...
EXEC ('DROP FUNCTION tempFunc')
...
GO

但是:

如果您有 2 个并发执行,它将失败,因为 tempFunc 已经存在 如果每个 udf 定义不同,则需要随机名称 如果随机命名,其余代码也必须是动态 SQL 存储过程意味着重用,所以只需持久化它 您的代码需要 ddl_admin 或 db_owner 权限才能创建 udf ...

那么……你为什么要这样做?

【讨论】:

我想创建自定义过程,就像拆分词一样,将参数输入提供给存储过程级别我只在这个过程中使用了这个自定义函数。在这个过程之后,我不希望这个函数出现在sql 服务器级别。让我们考虑一下用户是否要创建自定义流程,他/她创建了自定义功能。完成此过程后,他需要删除该函数。类似地,如果他们不删除该函数,则会创建 1000 个自定义函数,我们需要更多空间用于数据库级别。

以上是关于用户在存储过程中定义函数的主要内容,如果未能解决你的问题,请参考以下文章

存储过程和用户​​定义函数的区别

Sqlserver中存储过程,触发器,自定义函数

用户定义函数和存储过程之间的性能差异

MySQL存储过程和自定义函数Navicat for mysql创建存储过程和函数调用存储过程和函数的区别

oracle存储过程和自定义函数

存储过程和函数之间有几个区别