Передача результатов инструкции select в качестве параметров хранимой процедуре

#sql-server #loops #stored-procedures

#sql-сервер #циклы #хранимые процедуры

Вопрос:

У меня есть хранимая процедура, которая выполняет различные проверки и вставляет значения в несколько таблиц.

 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 раз или в зависимости от количества строк в select.

 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. У Эрланда есть хорошая дискуссия о массивах и списках . Далее следует его обсуждение использования TVP

Ответ №1:

Прямой вариант заключается в использовании курсора:

 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; 
  

Однако обычно вы можете найти альтернативу на основе НАБОРА, более подходящую для SQL, чем процедурные.

В этом случае вы бы отложили хранимую процедуру, и вся логика для параметров должна быть установлена на основе. Например, для хранимой процедуры, которой вы поделились, это может быть что-то вроде этого:

 INSERT INTO dbo.Table2
    SELECT NEWID(), column2, column3, column4
    FROM dbo.Table1 AS T1
    WHERE T1.column1 IS NULL
  

Я предполагаю, что вы думали о более проработанной логике, поэтому, если вы хотите поделиться, мы можем взглянуть и рассказать вам, как ее преобразовать. Иногда это просто, а иногда нет, и результат нелегко понять. В этом случае вам следует оценить плюсы и минусы каждого подхода.

Комментарии:

1. @DDLearn — помог ли вам этот ответ?