Sql server 如何在表中执行一组存储过程
我有一个在文件结构中存储存储过程名称的表。其思想是,调用存储过程将作为参数以字符串形式给出;这些是我要执行的存储过程的显示名称 然后,我想搜索存储过程表,并执行显示名称与输入集匹配的存储过程 例如,可以为调用存储过程提供一组字符串“foo”、“bar”和“baz”。这意味着我希望能够执行“dbo.foo_存储过程”、“dbo.bar_存储过程”和“dbo.baz_存储过程” 我正在使用SQL Server 2012。有什么想法吗 顺便说一句,我的存储过程表如下所示: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
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中的正常情况)。所以,尽管我同意游标在技术上是更好的样式,但出于一致性的考虑,我仍然希望使用循环。