Альтернатива итерации для INSERT SELECT UPDATE в последовательности

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

  • INSERT INTO TABLE1 с использованием данных MASTERTABLE (MASTERTABLE имеет 6 столбцов)
  • ВЫБЕРИТЕ значение идентификатора столбца (первичный ключ) вновь вставленной строки из ТАБЛИЦЫ1
  • Обновите это значение ID в ТАБЛИЦЕ2, используя хранимую процедуру.

Я пытался:

  • цикл while: выполнение заняло около 3 часов
  • курсор: отменил запрос после его выполнения за ночь
  • Насколько я понимаю, я не могу использовать JOIN, так как мне нужно выполнять инструкции в последовательности

Я предполагаю, что идентификатор - это личность. Вопрос требует более подробного описания. Посмотрите результат. VTC не совсем ясен, но я удалю это, когда вы предоставите более подробную информацию.

paparazzo 20.04.2018 17:17

@paparazzo любезно взгляните на обновленный вопрос

Jaideep 20.04.2018 17:24

Мне все еще не хватает деталей. Я сдаюсь.

paparazzo 20.04.2018 17:28

Ответ можно найти здесь. spaghettidba.com/2015/04/24/…

Sean Lange 20.04.2018 17:38

Рассматривали ли вы INSERT TRIGGER на TABLE1, из которого можно вызвать хранимую процедуру на TABLE2?

MtwStark 20.04.2018 17:39

Если это просто обновление идентификатора в таблице 2, зачем вам SP, есть ли какая-то особая логика в этом SP, или вы можете выполнить обновление без использования SP. Предложение OUTPUT - ваш помощник (в операторе вставки) для получения списка идентификаторов.

Pred 20.04.2018 18:13
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
6
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вопросы недостаточно подробны. По идее я хотел бы использовать что-то вроде этого

-- create a output table to hold new id, and key columns to join later
DECLARE @OutputTbl TABLE (ID INT, key_Columns in MASTERTABLE)

INSERT INTO TABLE1
OUTPUT INSERTED.ID, MASTERTABLE.key_columns INTO @OutputTbl 
SELECT *
FROM MASTERTABLE 

UPDATE T2
SET ID = o.ID
FROM TABLE2 t2
INNER JOIN OutputTbl o
  ON t2.key_column = o.key_column 

Может быть, вы можете рассмотреть TRIGGER на TABLE1, из которого можно вызывать хранимую процедуру на TABLE2, а затем вы можете вызывать свой INSERT по своему желанию / необходимости .. один за другим или блоками ..

DROP TRIGGER TR_UPD_TABLE2 
GO

CREATE TRIGGER TR_UPD_TABLE2 ON TABLE1 AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @columnID INT = NULL 

    IF (SELECT COUNT(*) FROM INSERTED)=1 BEGIN
        -- SINGLE INSERT
        SET @columnID = (SELECT columnID FROM INSERTED)

        EXEC TableTwoUpdateProcedure @columnID

    END ELSE BEGIN
        -- MASSIVE INSERT (IF NEEDED)
        SET @columnID = 0

        WHILE @columnID IS NOT NULL  BEGIN
            SET @columnID = (SELECT MIN(columnID) FROM INSERTED WHERE columnID > @columnID)

            IF @columnID IS NOT NULL BEGIN
                EXEC TableTwoUpdateProcedure @columnID
            END
        END

    END 
END

Другие вопросы по теме