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

Sql server 如何在表中执行一组存储过程,sql-server,tsql,stored-procedures,dynamic-sql,execute,Sql Server,Tsql,Stored Procedures,Dynamic Sql,Execute,我有一个在文件结构中存储存储过程名称的表。其思想是,调用存储过程将作为参数以字符串形式给出;这些是我要执行的存储过程的显示名称 然后,我想搜索存储过程表,并执行显示名称与输入集匹配的存储过程 例如,可以为调用存储过程提供一组字符串“foo”、“bar”和“baz”。这意味着我希望能够执行“dbo.foo_存储过程”、“dbo.bar_存储过程”和“dbo.baz_存储过程” 我正在使用SQL Server 2012。有什么想法吗 顺便说一句,我的存储过程表如下所示: CREATE TABLE d

我有一个在文件结构中存储存储过程名称的表。其思想是,调用存储过程将作为参数以字符串形式给出;这些是我要执行的存储过程的显示名称

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

例如,可以为调用存储过程提供一组字符串“foo”、“bar”和“baz”。这意味着我希望能够执行“dbo.foo_存储过程”、“dbo.bar_存储过程”和“dbo.baz_存储过程”

我正在使用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示例:

游标可以在结果集中循环并执行存储过程

这个(简单但未经测试的)脚本循环@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

您可以使用动态SQL,例如,但与其他类型的名称不同,过程名称可以在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;

Ok很有道理。只是想知道,我们能用循环代替光标吗?@sahibeast:我不知道你的意思。使用游标时,通常总是使用循环–逐行遍历游标返回的结果集。你的意思是使用没有光标的循环吗?@Andrey M:是的,对不起。我明白我的意思。使用循环来解析结果集而不使用光标。@sahibeast:也许可以使用循环来模拟光标而不实际使用光标语法,但为什么要这样做?在SQL中,数据是以集合的形式处理的,当您必须逐行而不是以集合的方式处理数据时,游标正是一种工具。完全没有必要重新发明轮子。如果不需要游标,通常意味着也不需要循环(这很好,因为这是SQL中的正常情况)。所以,尽管我同意游标在技术上是更好的样式,但出于一致性的考虑,我仍然希望使用循环。