#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 — помог ли вам этот ответ?