我有一个表,用于在我的文件结构中存储存储过程的名称。这个想法是调用存储过程将被赋予
@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 服务器示例:
游标可以循环遍历结果集并执行存储过程。
这个(简单,但未经测试)脚本循环 @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,就像 在 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;
我想对表中的每个主键字段调用存储过程。
在 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 ;