对表中的每条记录执行存储过程

时间:2010-06-18 18:04:02

标签: sql sql-server stored-procedures loops

我有两个需要更新的表,Master和Identifiers:


--MasterID(PK)
--ModifiedDate
--ModifiedBy

标识符
--IdentifierID
--MasterID(FK to Master)
--Identifier
--IdentifierType
--ModifiedDate
--ModifiedBy

Master表存在的唯一理由是将不同的标识符绑定到一个人身上。

我收到一个文件,其中包含需要插入标识符的新标识符信息(MasterID(如果可用),Identifier,IdentifierType)。具有MasterID的记录显然很容易插入;但是,没有一个的记录有点困难。

在将数据插入Identifiers表之前,必须生成一个新的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 个答案:

答案 0 :(得分: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

我不得不说:你的架构是否存在。主表几乎没有用处......