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

Sql 在存储过程中使用用户定义函数,sql,sql-server-2005,Sql,Sql Server 2005,我们是否可以在存储过程中创建用户定义函数,然后在存储过程结束时,我们需要删除该自定义用户定义函数。您可以,但它可能会变得混乱 看。这将允许您运行任意SQL,包括DDL。以这种方式创建和使用UDF看起来确实有点危险——您需要确保与竞争线程之间没有任何名称冲突,并且无法获得任何类型的查询优化 我会仔细检查你的设计,以确保没有其他解决方案 动态SQL是唯一的方法 ALTER PROC ... AS ... EXEC ('CREATE FUNCTION tempFunc...') ... EXEC ('

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

您可以,但它可能会变得混乱

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


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

动态SQL是唯一的方法

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

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

所以。。。为什么要这样做?

我想创建自定义进程,就像为存储过程级别提供参数输入的拆分字一样。我仅将此自定义函数用于此进程。在此进程之后,我不希望此函数出现在sql server级别。让我们考虑一下,如果用户想要创建自定义进程,他/她创建了自定义函数。完成此过程后,他需要删除该函数。如果他们不删除该函数,我们需要更多的数据库空间。这看起来像是以下函数的副本: