将select语句的结果作为参数传递给存储过程

时间:2020-09-12 15:56:18

标签: sql-server loops stored-procedures

我有一个存储过程,可以进行各种检查并将值插入多个表中。

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

1 个答案:

答案 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

我想您正在考虑一个更详细的逻辑,因此,如果您想分享我们可以看一下并告诉您如何进行转换。有时很容易,有时却不容易,结果也不容易理解。在这种情况下,您应该评估每种方法的利弊。