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

时间:2014-07-28 21:53:17

标签: sql-server tsql stored-procedures dynamic-sql execute

我有一个表,用于在我的文件结构中存储存储过程的名称。这个想法是调用存储过程将被赋予@in_Strings作为参数;这些是我想要执行的存储过程的显示名称。

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

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

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

BTW,我的存储过程表如下所示:

CREATE TABLE dbo.SPROCS
(
    Display_Name NVARCHAR(256) NOT NULL,
    SPROC_Name NVARCHAR(256) NOT NULL,
    CreatedDateTime DATETIME2(2) NOT NULL DEFAULT GETUTCDATE()
)

2 个答案:

答案 0 :(得分:1)

一个sql server示例:

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

这个(简单但未经测试的)脚本循环@in_strings变量中的每个sproc。

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 :(得分:1)

您可以使用动态SQL,例如in paqogomez's answer,但与其他任何类型的名称不同,过程名称可以在SQL Server中进行参数化,因此在这种情况下不需要动态SQL。

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

DECLARE @SPROC_Name nvarchar(256);

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

EXECUTE @SPROC_Name;

就像那样。

但是,由于您提到了 set 字符串,因此您需要一个游标来遍历匹配过程名称的结果集,并将每个名称传递给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;