2010-06-18 83 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