【问题标题】:Nested procedures in procedures过程中的嵌套过程
【发布时间】:2022-01-04 11:01:45
【问题描述】:

是否可以在 SQL Server 中创建一个过程,其中可以将另一个过程作为参数传递给执行? 类比泛型方法。

例如:

ALTER PROCEDURE [db].[myProc]
...
 @externalProc              PROCEDURE?    
...
 
BEGIN

  DECLARE 2 datetime variables: start/end
  SET start = GETDATE()
  EXEC @externalProc
  SET end = GETDATE()
//Other work with the received data

END      

底线是我想创建 1 个通用过程,它将对许多其他过程执行相同的操作。

【问题讨论】:

  • 没有。参数必须是TYPE,例如varchardatetime 或用户定义的table 类型,而不是对象。
  • 您可以参数化过程名称...dbfiddle.uk/…

标签: sql sql-server database


【解决方案1】:

您可以将过程名称作为包装存储过程的参数传递并动态执行它。但是,我建议避免这种动态过程执行,因为它会导致很多问题。其中一些:

  • 不知道参数过程内容的逻辑是什么
  • 可能导致 SQL 注入
  • 可能会导致安全问题

我正在为如何完成此操作的测试用例提供示例代码。我没有考虑过 SQL 注入和其他事情。我只是想表明这是可能的。

-- stored procedure to call
create procedure dbo.test
as
select 1

-- Wrapper stored procedure
create procedure dbo.uber_proc
@procname VARCHAR(128)
as
begin
DECLARE @sql_stmt NVARCHAR(256) = 'EXEC ' + @procname
EXEC(@sql_stmt)
end

-- Executing wrapper stored procedure
EXEC dbo.uber_proc 'dbo.test'

更新 感谢@Iptr,我们还可以创建包装存储过程,如下所示:

CREATE procedure dbo.uber_proc
@procname VARCHAR(128)
as
begin
  EXEC @procname
end

【讨论】:

  • 不需要动态 sql .. 而不是 exec(@sql) 只需执行 exec @procname (注意 exec 后面没有括号)
  • @Iptr,我已经更新了我的答案。我不知道这是可能的。谢谢你启发我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2011-09-28
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多