[英]Loop in stored procedure in SQL server
我需要帮助编写调用另一个存储过程并将值传递给它的存储过程。 到目前为止,这是在 C# 中完成的,现在我想将它移动到存储过程并创建一个在特定时间调用它的 SQL 代理作业。 有任何想法吗? 情况就是这样。
Table A
:
PK_TableA_ID
Table B
:
PK_TableB_ID
存储过程SP1
:
@TableA_ID
@TableB_ID
我需要这个,但在 T-SQL 中
foreach(var TableAId in TableA)
{
foreach(var TableBId in TableB)
{
//call stored procedure
SP1(TableAId, TableBId);
}
}
以下是如何使用游标执行循环的示例:
-- set up some test data
declare @table_a table (PK_TableA_ID int)
declare @table_b table (PK_TableB_ID int)
insert @table_a values (1),(2),(3)
insert @table_b values (4),(5),(6)
-- do the actual processing
SET NOCOUNT ON
DECLARE @TableA_ID int, @TableB_ID int
DECLARE TableA_cursor CURSOR FOR SELECT PK_TableA_ID FROM @table_a
OPEN TableA_cursor
FETCH NEXT FROM TableA_cursor INTO @TableA_ID
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE TableB_cursor CURSOR FOR SELECT PK_TableB_ID FROM @table_b
OPEN TableB_cursor
FETCH NEXT FROM TableB_cursor INTO @TableB_ID
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT CAST(@TableA_ID AS CHAR(1)) + ':' + CAST(@TableB_ID AS CHAR(1))
-- execute your stored procedure here:
-- EXEC Your_stored_procedure (@TableA_ID, @TableB_ID)
FETCH NEXT FROM TableB_cursor INTO @TableB_ID
END
CLOSE TableB_cursor
DEALLOCATE TableB_cursor
FETCH NEXT FROM TableA_cursor INTO @TableA_ID
END
CLOSE TableA_cursor
DEALLOCATE TableA_cursor
上面的光标(带有临时表中的测试数据)将生成以下输出:
1:4
1:5
1:6
2:4
2:5
2:6
3:4
3:5
3:6
但是,使用游标可能不是解决问题的最佳方法。
在这种情况下,我使用表 id 有一个没有游标的干净和清晰的选项。
DECLARE
@Counter1 INT,@MaxId1 INT,
@Counter2 INT, @MaxId2 INT
SELECT @Counter1 = min(PK_TableA_ID) , @MaxId1 = max(PK_TableA_ID)
FROM TableA
SELECT @Counter2 = min(PK_TableB_ID) , @MaxId2 = max(PK_TableB_ID)
FROM TableB
WHILE(@Counter1 IS NOT NULL AND @Counter1 <= @MaxId1)
BEGIN
WHILE(@Counter2 IS NOT NULL AND @Counter2 <= @MaxId2)
BEGIN
//call stored procedure
SP1(@Counter1, @Counter2);
SET @Counter2 = @Counter2 + 1
END;
SELECT @Counter2 = min(PK_TableB_ID) , @MaxId2 = max(PK_TableB_ID)
FROM TableB
SET @Counter1 = @Counter1 + 1
END;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.