我们可以在另一个存储过程中编写子函数或过程

19 sql sql-server-2005

我想检查SQL Server(2000/05/08)是否具有编写嵌套存储过程的能力,我的意思是 - 在另一个存储过程中编写子函数/过程.不要叫另一个SP.

为什么我在考虑它是 - 我的一个SP有重复的代码行,并且只针对此SP.So如果我们有这个嵌套的SP功能,那么我可以在我的主SP中声明另一个子/本地程序把所有重复的行放在那里.我可以在我的主SP中调用本地sp.我记得Oracle SP中提供了这样的功能.

如果SQL服务器也具有此功能,有人可以解释一些有关它的更多详细信息或提供我可以找到文档的链接.

在此先感谢Sai

Joh*_*ohn 5

我不建议这样做,因为每次创建时都必须计算新的执行计划,但是肯定可以完成(一切皆有可能,但并不总是建议).

这是一个例子:

CREATE PROC [dbo].[sp_helloworld]
AS
BEGIN
    SELECT 'Hello World'
    DECLARE @sSQL VARCHAR(1000)
    SET @sSQL = 'CREATE PROC [dbo].[sp_helloworld2]
            AS
            BEGIN
                SELECT ''Hello World 2''
            END'
    EXEC (@sSQL)

    EXEC [sp_helloworld2];
    DROP PROC [sp_helloworld2];
END
Run Code Online (Sandbox Code Playgroud)

你会得到警告

The module 'sp_helloworld' depends on the missing object 'sp_helloworld2'.
The module will still be created; however, it cannot run successfully until
the object exists.
Run Code Online (Sandbox Code Playgroud)

您可以使用上面的EXEC('sp_helloworld2')绕过此警告.

但如果你打电话给EXEC [sp_helloworld],你会得到结果

Hello World
Hello World 2
Run Code Online (Sandbox Code Playgroud)

  • 答案旨在说明使用动态SQL的可能性。..当然还有所有的红色警告。我认为在实际的生产环境中使用这种方法毫无意义。 (2认同)

and*_*ncx 4

它没有这个功能.除了阻止嵌套SPROC中的代码从其他地方调用之外,很难看出这样的功能会带来什么样的真正好处.

  • 通过仅在一个地方使用的特定于任务的功能和程序,不会使我的数据库混乱,这将带来真正的好处! (9认同)
  • 尝试定义一个简单的哈希表映射并对其进行一次硬编码怎么样,因为您不想在 SP 中对其进行多次硬编码。然而您不想将这种硬编码暴露给外界。 (3认同)
  • 对于可以打开和运行 .SQL 文件但无法存储过程或用户定义函数的只读用户来说,这也是必需的。访问产品或预产品的测试人员和开发人员有时适合该类别。 (2认同)