Выполните хранимую процедуру для каждой записи в таблице - PullRequest
1 голос
/ 18 июня 2010

У меня есть две таблицы, которые нужно обновить, Мастер и Идентификаторы:

Мастер
--MasterID (PK)
--ModifiedDate
--ModifiedBy

Идентификаторы
--IdentifierID
--MasterID (от ФК до Мастера)
--Identifier
--IdentifierType
--ModifiedDate
--ModifiedBy

Единственная причина существования Главной таблицы - привязать разные Идентификаторы к одному человеку.

Я получаю файл, который содержит новую информацию об идентификаторе (MasterID (если имеется), Identifier, IdentifierType), который необходимо вставить в идентификаторы. Записи, которые имеют MasterID, очевидно, просто вставить; однако, записи без них немного сложнее.

Новый MasterID должен быть создан до вставки данных в таблицу идентификаторов, чтобы его можно было использовать в качестве FK.

Я думал, что хранимый процесс что-то вроде этого может работать:

DECLARE @IDOutput INT

INSERT INTO Master
(
    ModifiedDate,
    ModifiedBy
)
VALUES
(
    GETDATE(),
    'Robert'
)

SET @IDOutput = SCOPE_IDENTITY()

INSERT INTO Identifiers
(
    MasterID,
    Identifier,
    IdentifierType,
    ModifiedDate,
    ModifiedBy    
)
VALUES
(
    @IDOutput,
    Identifier, --this comes from input file
    IdentifierType, --this comes from input file
    GETDATE(),
    'Robert'
)

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

Любая помощь по этому вопросу будет принята с благодарностью!

1 Ответ

1 голос
/ 18 июня 2010

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

Таким образом, вместо цикла вы выбираете «основные» строки из промежуточной таблицы и вставляете, сохраняя новые ключи в табличной переменной.,Затем вы используете это для заполнения дочерней таблицы.

Что-то вроде этого:

INSERT INTO Master (ModifiedDate, ModifiedBy, foo)
OUTPUT Inserted.MasterID, Inserted.ModifiedBy INTO @NewKeys
SELECT DISTINCT GETDATE(), 'Robert' FROM StagingTable


INSERT INTO Identifiers
(
    MasterID,
    Identifier,
    IdentifierType,
    ModifiedDate, ModifiedBy    
)
SELECT
    N.MasterID,
    S.Identifier, --this comes from input file
    S.IdentifierType, --this comes from input file
    GETDATE(), N.ModifiedBy
FROM
    StagingTable S
    JOIN
    @NewKeys N ON S.ModifiedBy = N.ModifiedBy

Я должен сказать: есть ли в вашей схеме больше ничего.Главный стол здесь почти бесполезен ...

...