我有一个存储过程,可以进行各种检查并将值插入多个表中。
ALTER PROCEDURE [dbo].[storedprocedurename]
@Parameter1 uniqueidentifier,
@Parameter2 datetime2,
@Parameter3 bit,
@Parameter4 varchar(max)
AS
BEGIN
IF @Parameter IS NULL
THEN
BEGIN
INSERT INTO
我还有一条select语句,该语句返回大约600行。
SELECT
column1, column2, column3, column4
FROM
Table1
输出:
Column1 Column2 Column3 Column 4
-------------------------------------------------------------------------
1 ared-234w-5yhe 12/07/2020 0 Table
2 fjed-reds-sdfg 10/10/1989 1 Chair
3 fgsv-34yg-jtut 1/4/1965 1 Computer
我基本上希望存储过程从select语句中获取值,将它们作为参数输入并执行。本质上,它将运行约600次或基于选择的行数。
EXEC [dbo].[storedprocedurename] 'ared-234w-5yhe', '12/07/2020', 0, 'Table'
EXEC [dbo].[storedprocedurename] 'fjed-reds-sdfg', '10/10/1989', 1, 'Chair'
我该怎么做?我正在使用SQL Server
答案 0 :(得分:1)
直接选择是使用cursor:
DECLARE @column1 uniqueidentifier
DECLARE @column2 datetime2
DECLARE @column3 bit
DECLARE @column4 varchar(max)
DECLARE cur_Table1 CURSOR
FOR SELECT column1, column2, column3, column4 FROM dbo.Table1
OPEN cur_Table1
FETCH NEXT FROM cur_Table1
INTO @column1, @column2, @column3, @column4
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC dbo.storedprocedurename @column1, @column2, @column3, @column4
FETCH NEXT FROM cur_Table1
INTO @column1, @column2, @column3, @column4
END
CLOSE cur_Table1;
DEALLOCATE cur_Table1;
但是,通常您会发现,基于SET的替代方法对SQL而言比过程方法更合适。
在这种情况下,您应该将存储过程放在一边,并且所有参数逻辑都应基于SET。例如,对于您共享的存储过程,可能是这样的:
INSERT INTO dbo.Table2
SELECT NEWID(), column2, column3, column4
FROM dbo.Table1 AS T1
WHERE T1.column1 IS NULL
我想您正在考虑一个更详细的逻辑,因此,如果您想分享我们可以看一下并告诉您如何进行转换。有时很容易,有时却不容易,结果也不容易理解。在这种情况下,您应该评估每种方法的利弊。