2010-06-18 84 views
1

每条记录​​我有需要更新两个表,硕士和标识符:执行存储过程的表


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

标识符
--IdentifierID
--MasterID(FK来掌握)
--Identifier
--IdentifierType
--ModifiedDate
--ModifiedBy

主表的唯一存在的理由是,以配合不同的标识符来一个人。

我收到一个文件,其中包含需要插入到标识符中的新标识符信息(MasterID(如果可用),标识符,标识符类型)。具有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 2010-06-18 18:27:19

+0

SQL Server 2008. – Sesame 2010-06-18 18:42:08

回答

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,驾驶执照等),所以创建了标识符表。主表是将它们连接在一起的。当然还有其他表格:人口统计,地址等,但我不关心那些表格。 – Sesame 2010-06-18 18:47:13