SQL-如何使用存储过程用新主键复制行
SQL- How to use Stored Procedure to duplicate row with new Primary Key?
我有7个表-Company、Person、Person_Link、Address、Address_Link、Phone、Phone_Link。我想要一个存储过程,它引入comp_companyid参数,然后它可以用新的主键和每个表的外键复制7个表中的所有行。
表格:
-
公司:PK-comp_companyidFK-comp_primarypersonid,comp_primary addressid
-
人员:PK-个人FK-每个公司
-
个人链接(_L):PK-pel_personlinkidFK-pel_personid、pel_companyid
-
地址链接(_L):PK-adli_addresslinkidFK-adli_addressid,adli_companyid
-
地址:PK-addr_addressid
-
电话:PK-电话号码
-
电话链接(_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()
将帮助您
相关文章:
- 如何将新的键/值对元素添加到现有数组
- 在对象上迭代.解构其键和属性并添加新的键和属性
- 如何外部联接两个数据集(基于多个主键)
- MVC Syncfusion Grid-HTML EJ Grid-获取Jquery中所选行的主键
- 在 Forerunner 数据库集合中创建主键时,key 属性是否可以位于集合对象的对象内部
- 如何使用php和javascript在主键前添加8个0
- 如何在不重新加载的情况下在表单编辑中更改主键后刷新jqgrid行id
- 在数据库中插入之前获取UID主键
- 在现有的json对象中添加一个新的键(数组)
- SQL-如何使用存储过程用新主键复制行
- 拆分键值对,给它们新的键
- AppJs 键盘快捷键(复制、粘贴、剪贴板、退出、全选...
- 在Javascript中使用新的引用创建一个新对象 - 不要复制或克隆 -
- 使用新的键,值对象(如果存在)更新多维数组或创建新的
- 如何在 javascript 中向数组添加新对象(键值对)
- 在Dynamo DB中用JavaScript向映射添加一个新的键值
- 禁用Sequelize JS中的主键
- 关于IndexedDb的iOS8实现的主键问题
- 如何获取上次插入的主键
- 将外部json查找中的值映射到数组中,作为新的键/值对