2010-06-18 2 views
1

У меня есть две таблицы, которые должны быть обновлены, Master и Идентификаторы:Выполнить хранимую процедуру для каждой записи в таблице

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

Идентификаторы
--IdentifierID
--MasterID (FK для Master)
--Identifier
--IdentifierType
--ModifiedDate
--ModifiedBy

единственная причина, главная таблица для существования, чтобы связать различные идентификаторы для одного человека.

Я получаю файл, содержащий новую информацию идентификатора (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' 
) 

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

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

+0

Какая версия SQL Server, пожалуйста? – gbn

+0

SQL Server 2008. – Sesame

ответ

1

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

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 

Я должен сказать, хотя: есть mnore к вашей схеме. Мастер-таблица почти не служит цели здесь ...

+0

Вы видите таблицы Master и Identifiers во всей их красе и, к сожалению, я не могу контролировать их дизайн. Немного предыстории: поскольку люди могут иметь разные «идентификаторы» (SSN, Driver's License и т. Д.), Была создана таблица Identifiers. Главный стол - это то, что связывает их все вместе. Конечно, есть и другие таблицы: Демография, Адреса и т. Д., Но меня это не касается. – Sesame

Смежные вопросы