如何在表中执行一组存储过程

问题描述 投票:0回答:3

我有一个表,用于在我的文件结构中存储存储过程的名称。这个想法是调用存储过程将被赋予

@in_Strings
作为参数;这些是我要执行的存储过程的显示名称。

然后,我想搜索我的存储过程表并执行显示名称与输入集匹配的存储过程。

例如,调用存储过程可能会被给予字符串“foo”、“bar”和“baz”的输入集。这意味着我希望能够执行 'dbo.foo_sproc'、'dbo.bar_sproc' 和 'dbo.baz_sproc'。

我正在使用 SQL Server 2012。有什么想法吗?

顺便说一句,我的存储过程表如下所示:

CREATE TABLE dbo.SPROCS
(
    Display_Name NVARCHAR(256) NOT NULL,
    SPROC_Name NVARCHAR(256) NOT NULL,
    CreatedDateTime DATETIME2(2) NOT NULL DEFAULT GETUTCDATE()
)
sql-server t-sql stored-procedures dynamic-sql execute
3个回答
2
投票

一个 sql 服务器示例:

游标可以循环遍历结果集并执行存储过程。

这个(简单,但未经测试)脚本循环 @in_strings 变量中的每个存储过程。

CREATE PROCEDURE getSprocs @in_Strings varchar(max)
AS
BEGIN
    DECLARE @sql varchar(max)
    DECLARE db_cursor CURSOR FOR  
    SELECT SPROC_Name
    FROM dbo.SPROCS
    where sproc_name in (@in_Strings)

    OPEN db_cursor   
    FETCH NEXT FROM db_cursor INTO @name   

    WHILE @@FETCH_STATUS = 0   
    BEGIN   
        set @sql = 'exec ' + @name
        exec @sql
        FETCH NEXT FROM db_cursor INTO @name   
    END   

    CLOSE db_cursor   
    DEALLOCATE db_cursor
END

1
投票

您可以使用动态 SQL,就像 在 paqogomez 的回答中,但是,与任何其他类型的名称不同,过程名称可以在 SQL Server 中参数化,因此在这种情况下不需要动态 SQL。

例如,如果这是关于单个过程,您可以使用以下简单方法读取并执行匹配的名称:

DECLARE @SPROC_Name nvarchar(256);

SELECT @SPROC_Name = SPROC_Name
FROM dbo.SPROCS
WHERE Display_Name = @in_string;

EXECUTE @SPROC_Name;

就这样。

由于您提到的是字符串,因此您将需要一个游标来循环遍历匹配过程名称的结果集,并将每个名称传递给 EXECUTE 语句。

DECLARE @SPROC_Name nvarchar(256);

DECLARE procnames CURSOR
    LOCAL FORWARD_ONLY STATIC READ_ONLY
FOR
    SELECT @SPROC_Name = SPROC_Name
    FROM dbo.SPROCS
    WHERE ... /* condition involving Display_Name and @in_string */
;

OPEN procnames;
FETCH NEXT FROM procnames INTO @SPROC_Name;

WHILE @@FETCH_STATUS = 0
BEGIN
    EXECUTE @SPROC_Name;
    FETCH NEXT FROM procnames INTO @SPROC_Name;
END;

CLOSE procnames;
DEALLOCATE procnames;

0
投票

我想对表中的每个主键字段调用存储过程。

在 MySQL 中,游标如下所示,源自此处的示例


DELIMITER //

-- To iterate over a table, use a cursor
CREATE PROCEDURE updateSomeField()
modifies sql data
BEGIN
  DECLARE done bool DEFAULT FALSE;
  DECLARE cId int;
  DECLARE curs CURSOR FOR SELECT primaryKeyId FROM Table;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN curs;
  
  read_loop: LOOP
    FETCH curs INTO cId;
    IF done THEN
      LEAVE read_loop;
    END IF;
    
    CALL someOtherStoredProc( cId );
  END LOOP;

  CLOSE curs;
END //



DELIMITER ;

© www.soinside.com 2019 - 2024. All rights reserved.