如何用多单列表的所有值组合调用SQL Server存储过程
问题:用所有参数组合调用存储过程(保留原签名)
现有表与存储过程定义
以下是SQL Server 2022环境下的表结构、数据插入及存储过程定义:
-- 创建用于存储值的单列表 CREATE TABLE [dbo].[Attr_1_Values] ( [Attr_1_Value] VARCHAR(30) NOT NULL PRIMARY KEY ); CREATE TABLE [dbo].[Attr_2_Values] ( [Attr_2_Value] VARCHAR(30) NOT NULL PRIMARY KEY ); CREATE TABLE [dbo].[Attr_3_Values] ( [Attr_3_Value] VARCHAR(30) NOT NULL PRIMARY KEY ); -- 向刚创建的表中插入行 INSERT INTO [dbo].[Attr_1_Values] ([Attr_1_Value]) VALUES ('Attr_1_val_1'); INSERT INTO [dbo].[Attr_1_Values] ([Attr_1_Value]) VALUES ('Attr_1_val_2'); INSERT INTO [dbo].[Attr_1_Values] ([Attr_1_Value]) VALUES ('Attr_1_val_3'); INSERT INTO [dbo].[Attr_1_Values] ([Attr_1_Value]) VALUES ('Attr_1_val_4'); INSERT INTO [dbo].[Attr_2_Values] ([Attr_2_Value]) VALUES ('Attr_2_val_1'); INSERT INTO [dbo].[Attr_2_Values] ([Attr_2_Value]) VALUES ('Attr_2_val_2'); INSERT INTO [dbo].[Attr_3_Values] ([Attr_3_Value]) VALUES ('Attr_3_val_1'); INSERT INTO [dbo].[Attr_3_Values] ([Attr_3_Value]) VALUES ('Attr_4_val_2'); -- 创建接收上述表中值作为参数的存储过程 CREATE PROCEDURE [dbo].[My_Stored_Procedure] @Attr_1_p AS VARCHAR(30), @Attr_2_p AS VARCHAR(30), @Attr_3_p AS VARCHAR(30) AS BEGIN -- 存储过程逻辑写在此处 END;
需求是生成三个表中值的所有组合(共422=16组),用每组值单独调用My_Stored_Procedure,且保留存储过程原有签名。
实现方案:游标迭代调用
由于要保留原存储过程签名,采用游标遍历所有参数组合,逐个调用存储过程,代码如下:
-- 声明变量存储单个组合的参数值 DECLARE @Attr1 VARCHAR(30), @Attr2 VARCHAR(30), @Attr3 VARCHAR(30); -- 声明游标,获取所有参数组合 DECLARE AttrCombinationCursor CURSOR FOR SELECT av1.Attr_1_Value, av2.Attr_2_Value, av3.Attr_3_Value FROM dbo.Attr_1_Values av1 CROSS JOIN dbo.Attr_2_Values av2 CROSS JOIN dbo.Attr_3_Values av3; -- 打开游标 OPEN AttrCombinationCursor; -- 读取第一组参数 FETCH NEXT FROM AttrCombinationCursor INTO @Attr1, @Attr2, @Attr3; -- 遍历所有组合并调用存储过程 WHILE @@FETCH_STATUS = 0 BEGIN EXEC dbo.My_Stored_Procedure @Attr_1_p = @Attr1, @Attr_2_p = @Attr2, @Attr_3_p = @Attr3; -- 读取下一组参数 FETCH NEXT FROM AttrCombinationCursor INTO @Attr1, @Attr2, @Attr3; END; -- 清理游标资源 CLOSE AttrCombinationCursor; DEALLOCATE AttrCombinationCursor;
补充说明
- 实际业务中,
My_Stored_Procedure是按需求传入单个参数组合调用的,测试场景下需要覆盖所有参数组合以确保全面性。 - 虽然基于集合的方法(如修改存储过程接收表值参数)更符合SQL的集合操作特性,但会增加客户端调用复杂度——客户端无法直接传入单个参数值,必须先构造单行表参数。因此选择保留原存储过程签名,采用迭代调用的方式。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

