我有一个表,用于在我的文件结构中存储存储过程的名称。这个想法是调用存储过程将被赋予@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()
)
答案 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;