SQL-如何使用存储过程用新主键复制行

SQL- How to use Stored Procedure to duplicate row with new Primary Key?

本文关键字:新主键 复制 存储过程 何使用 SQL-      更新时间:2023-10-15

我有7个表-Company、Person、Person_Link、Address、Address_Link、Phone、Phone_Link。我想要一个存储过程,它引入comp_companyid参数,然后它可以用新的主键和每个表的外键复制7个表中的所有行。

表格:

  1. 公司:PK-comp_companyidFK-comp_primarypersonid,comp_primary addressid

  2. 人员:PK-个人FK-每个公司

  3. 个人链接(_L):PK-pel_personlinkidFK-pel_personid、pel_companyid

  4. 地址链接(_L):PK-adli_addresslinkidFK-adli_addressid,adli_companyid

  5. 地址:PK-addr_addressid

  6. 电话:PK-电话号码

  7. 电话链接(_L):PK-plink_linkidFK-plink_phoneid

我的努力:

    INSERT INTO Company
    (
        Comp_CompanyId, Comp_PrimaryPersonId, Comp_PrimaryAddressId, Comp_Name, Comp_Type, Comp_Status, Comp_CreatedBy, Comp_CreatedDate, Comp_UpdatedBy, Comp_UpdatedDate, Comp_TimeStamp,
        Comp_SecTerr, Comp_WebSite
    )
    SELECT  @companyId, @PersonId, @AddressId, Comp_Name, Comp_Type, Comp_Status, Comp_CreatedBy, Comp_CreatedDate, Comp_UpdatedBy, Comp_UpdatedDate, Comp_TimeStamp,
            Comp_SecTerr, Comp_WebSite
    FROM Company
    WHERE Comp_CompanyId = @comp_companyid

    INSERT INTO Person
    (
        Pers_PersonId, Pers_CompanyId, Pers_PrimaryUserId, Pers_FirstName, pers_SecTerr, Pers_CreatedBy, Pers_CreatedDate, Pers_UpdatedBy, Pers_UpdatedDate, Pers_TimeStamp
    )
    SELECT @PersonId, @companyId, Pers_PrimaryUserId, Pers_FirstName, pers_SecTerr, Pers_CreatedBy, Pers_CreatedDate, Pers_UpdatedBy, Pers_UpdatedDate, Pers_TimeStamp
    FROM Person
    WHERE Pers_CompanyId = @comp_companyid

    INSERT INTO Person_Link
    (
        PeLi_PersonLinkId, PeLi_PersonId, PeLi_CompanyID, PeLi_CreatedBy, PeLi_CreatedDate, PeLi_UpdatedBy, PeLi_UpdatedDate, PeLi_TimeStamp
    )
    SELECT @PersonLinkId, @PersonId, @CompanyId, PeLi_CreatedBy, PeLi_CreatedDate, PeLi_UpdatedBy, PeLi_UpdatedDate, PeLi_TimeStamp
    FROM Person_Link
    WHERE PeLi_CompanyID = @comp_companyid

    INSERT INTO Address_Link
    (
        AdLi_AddressLinkId, AdLi_AddressId, AdLi_CompanyID, AdLi_CreatedBy, AdLi_CreatedDate, AdLi_UpdatedBy, AdLi_UpdatedDate, AdLi_TimeStamp, AdLi_Type
    )
    SELECT @AddressLinkId, @AddressId, @companyId, AdLi_CreatedBy, AdLi_CreatedDate, AdLi_UpdatedBy, AdLi_UpdatedDate, AdLi_TimeStamp, AdLi_Type
    FROM Address_Link
    WHERE  AdLi_CompanyID = @comp_companyid

    INSERT INTO [Address]
    (
        Addr_AddressId, Addr_Address1, Addr_Address2, Addr_Address3, Addr_Address4, addr_postcode, Addr_CreatedBy, Addr_CreatedDate,
        Addr_UpdatedBy, Addr_UpdatedDate, Addr_TimeStamp
    )
    SELECT @AddressId, Addr_Address1, Addr_Address2, Addr_Address3, Addr_Address4, addr_postcode, Addr_CreatedBy, Addr_CreatedDate,
           Addr_UpdatedBy, Addr_UpdatedDate, Addr_TimeStamp
    FROM Address
    LEFT JOIN Address_Link
    ON Addr_AddressId = AdLi_AddressId
    AND AdLi_CompanyID = @comp_companyid

    INSERT INTO Phone
    (
        Phon_PhoneId, Phon_Number, Phon_CreatedBy, Phon_CreatedDate, Phon_UpdatedBy, Phon_UpdatedDate, Phon_TimeStamp
    )
    SELECT @PhoneId, Phon_Number, Phon_CreatedBy, Phon_CreatedDate, Phon_UpdatedBy, Phon_UpdatedDate, Phon_TimeStamp
    FROM Phone
    WHERE Phon_PhoneId = @@IDENTITY

    INSERT INTO PhoneLink
    (
        PLink_LinkID, PLink_CreatedBy, PLink_CreatedDate, PLink_UpdatedDate, PLink_TimeStamp,
        PLink_EntityID, PLink_RecordID, PLink_Type, PLink_PhoneId
    )
    SELECT  @PhoneLinkId, PLink_CreatedBy, PLink_CreatedDate, PLink_UpdatedDate, PLink_TimeStamp,
            PLink_EntityID, PLink_RecordID, PLink_Type, @PhoneId
    FROM PhoneLink
    WHERE PLink_LinkID = @@IDENTITY
    -- EXEC @PhoneId = crm_next_id 14
    -- EXEC @PhoneLinkId = crm_next_id 10208

它为公司工作;个人&Person_Link,但在其他表上显示错误。错误消息为:

"违反PRIMARY KEY约束'PK__Address___533839D503317E3D'。无法在对象'dbo.Address_Link'中插入重复的密钥。"(dbo.Address也是)

它没有指定电话表的错误,但电话表不会创建任何新行。有人知道怎么解决这个问题吗?谢谢

我想你想知道,在公司中插入第一行(例如)后,这是你刚刚插入的公司的ID。

SCOPE_IDENTITY()将帮助您