2016-04-25 143 views
0

我的任务是使用存储过程复制公司信息。我必须使用光标来完成我的任务,作为我的技术主管的订单。每当我运行SP时,我都会遇到这个错误。其他表格,如我在前面的问题中提到的人员,地址已经解决,现在剩下的只是电话&电话链接表,这让我很头疼。INSERT语句与FOREIGN KEY约束冲突(光标)

P/S:

  • ENTITYID = 5(公司)

下面是我的代码:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[DuplicateCompanyInfo] 
    @Comp_CompanyId NVARCHAR(80) 


AS 
BEGIN 
    SET NOCOUNT ON; 

DECLARE @CompanyID NVARCHAR(30), 
     @PersonID NVARCHAR(30), 
     @AddressID NVARCHAR(30), 
     @PhoneLinkID NVARCHAR(30), 
     @PhoneID NVARCHAR(30) 
      EXEC @companyId = crm_next_id 5 
      EXEC @PersonId = crm_next_id 13 
      EXEC @AddressId = crm_next_id 1 



     -- Add Company 
     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, '1', 
       GETDATE(), '1', GETDATE(), GETDATE(), Comp_SecTerr, Comp_WebSite 

     FROM Company 
     WHERE Comp_CompanyId = @comp_companyid 
     AND Comp_Deleted is null 


------- Company PhoneLink (Business) Cursor ----------------------------------------- 
     -- Declare Variables 
     DECLARE @c_PLink_LinkID NVARCHAR(30) 
     DECLARE @c_PLink_PhoneId NVARCHAR(30) 
     DECLARE @c_PLink_CreatedBy NVARCHAR(30) 
     DECLARE @c_PLink_CreatedDate NVARCHAR(30) 
     DECLARE @c_PLink_UpdatedDate NVARCHAR(30) 
     DECLARE @c_PLink_TimeStamp NVARCHAR(30) 
     DECLARE @c_PLink_EntityID NVARCHAR(30) 
     DECLARE @c_PLink_RecordID NVARCHAR(30) 
     DECLARE @c_PLink_Type NVARCHAR(30) 


     --Declare Cursor 
     DECLARE CompPhoneLinkCursor CURSOR FOR 
     SELECT PLink_LinkID, PLink_PhoneId, PLink_CreatedBy, PLink_CreatedDate, PLink_UpdatedDate, PLink_TimeStamp, 
       PLink_EntityID, PLink_RecordID, PLink_Type 
     FROM PhoneLink 
     INNER JOIN Phone 
     ON PLink_PhoneId = Phon_PhoneId 
     AND PLink_RecordID = @Comp_CompanyId 
     AND Plink_EntityID = '5' 
     AND Plink_Type = 'Business' 
     AND Phon_Deleted is null 
     AND Plink_Deleted is null 


     --Open Cursor & fetch 1st row into variables 
     OPEN CompPhoneLinkCursor 
     FETCH NEXT FROM CompPhoneLinkCursor INTO @c_PLink_LinkID, @c_PLink_PhoneId, @c_PLink_CreatedBy, @c_PLink_CreatedDate, 
             @c_PLink_UpdatedDate, @c_PLink_TimeStamp, @c_PLink_EntityID, @c_PLink_RecordID, @c_PLink_Type 


     --Fetch successful 
     --Check for a new row 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 

     EXEC @PhoneLinkID = crm_next_id 10208 
     EXEC @PhoneId = crm_next_id 14 


      INSERT INTO PhoneLink 
      (
       PLink_LinkID, PLink_PhoneId, PLink_CreatedBy, PLink_CreatedDate, PLink_UpdatedDate, 
       PLink_TimeStamp, PLink_EntityID, PLink_RecordID, PLink_Type 
      ) 
      VALUES 
      (
       @PhoneLinkID, @PhoneId, '1', GETDATE(), GETDATE(), 
       GETDATE(), @c_PLink_EntityID, @c_PLink_RecordID, 'Business' 
      ) 


     --Get next available row into variables 
     FETCH NEXT FROM CompPhoneLinkCursor INTO @c_PLink_LinkID, @c_PLink_PhoneID, @c_PLink_CreatedBy, @c_PLink_CreatedDate, 
             @c_PLink_UpdatedDate, @c_PLink_TimeStamp, @c_PLink_EntityID, @c_PLink_RecordID, @c_PLink_Type 

     END 

     CLOSE CompPhoneLinkCursor 
     DEALLOCATE CompPhoneLinkCursor 



------- Company Phone (Business) Cursor --------------------------------------------- 
     -- Declare Variables 
     DECLARE @c_Phon_PhoneId NVARCHAR(30) 
     DECLARE @c_Phon_Number NVARCHAR(30) 
     DECLARE @c_Phon_CreatedBy NVARCHAR(30) 
     DECLARE @c_Phon_CreatedDate NVARCHAR(30) 
     DECLARE @c_Phon_UpdatedBy NVARCHAR(30) 
     DECLARE @c_Phon_UpdatedDate NVARCHAR(30) 
     DECLARE @c_Phon_TimeStamp NVARCHAR(30) 


     --Declare Cursor 
     DECLARE CompPhoneCursor CURSOR FOR 
     SELECT Phon_PhoneId, Phon_Number, Phon_CreatedBy, Phon_CreatedDate, Phon_UpdatedBy, Phon_UpdatedDate, Phon_TimeStamp 
     FROM Phone 
     INNER JOIN PhoneLink 
     ON Phon_PhoneId = PLink_PhoneId 
     AND PLink_RecordID = @Comp_CompanyId 
     AND Plink_EntityID = '5' 
     AND Plink_Type = 'Business' 
     AND Phon_Deleted is null 
     AND Plink_Deleted is null 


     --Open Cursor & fetch 1st row into variables 
     OPEN CompPhoneCursor 
     FETCH NEXT FROM CompPhoneCursor INTO @c_Phon_PhoneId, @c_Phon_Number, @c_Phon_CreatedBy, @c_Phon_CreatedDate, 
             @c_Phon_UpdatedBy, @c_Phon_UpdatedDate, @c_Phon_TimeStamp 


     --Fetch successful 
     --Check for a new row 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 


     INSERT INTO Phone 
     (
      Phon_PhoneId, Phon_Number, Phon_CreatedBy, Phon_CreatedDate, Phon_UpdatedBy, Phon_UpdatedDate, Phon_TimeStamp 
     ) 
     VALUES 
     (
      @PhoneID, @c_Phon_Number, '1', GETDATE(), '1', GETDATE(), GETDATE() 
     ) 


     --Get next available row into variables 
     FETCH NEXT FROM CompPhoneCursor INTO @c_Phon_PhoneId, @c_Phon_Number, @c_Phon_CreatedBy, @c_Phon_CreatedDate, 
             @c_Phon_UpdatedBy, @c_Phon_UpdatedDate, @c_Phon_TimeStamp 

     END 

     CLOSE CompPhoneCursor 
     DEALLOCATE CompPhoneCursor 



------- Company PhoneLink (Fax) Cursor ---------------------------------------------- 
     -- Declare Variables 
     DECLARE @cf_PLink_LinkID NVARCHAR(30) 
     DECLARE @cf_PLink_PhoneId NVARCHAR(30) 
     DECLARE @cf_PLink_CreatedBy NVARCHAR(30) 
     DECLARE @cf_PLink_CreatedDate NVARCHAR(30) 
     DECLARE @cf_PLink_UpdatedDate NVARCHAR(30) 
     DECLARE @cf_PLink_TimeStamp NVARCHAR(30) 
     DECLARE @cf_PLink_EntityID NVARCHAR(30) 
     DECLARE @cf_PLink_RecordID NVARCHAR(30) 
     DECLARE @cf_PLink_Type NVARCHAR(30) 


     --Declare Cursor 
     DECLARE CompanyFaxLinkCursor CURSOR FOR 
     SELECT PLink_LinkID, PLink_PhoneId, PLink_CreatedBy, PLink_CreatedDate, PLink_UpdatedDate, PLink_TimeStamp, 
       PLink_EntityID, PLink_RecordID, PLink_Type 
     FROM PhoneLink 
     INNER JOIN Phone 
     ON PLink_PhoneId = Phon_PhoneId 
     AND PLink_RecordID = @Comp_CompanyId 
     AND Plink_EntityID = '5' 
     AND Plink_Type = 'Fax' 
     AND Plink_Deleted is null 
     AND Phon_Deleted is null 


     --Open Cursor & fetch 1st row into variables 
     OPEN CompanyFaxLinkCursor 
     FETCH NEXT FROM CompanyFaxLinkCursor INTO @cf_PLink_LinkID, @cf_PLink_PhoneId, @cf_PLink_CreatedBy, @cf_PLink_CreatedDate, 
             @cf_PLink_UpdatedDate, @cf_PLink_TimeStamp, @cf_PLink_EntityID, @cf_PLink_RecordID, @cf_PLink_Type 


     --Fetch successful 
     --Check for a new row 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 

     EXEC @PhoneLinkID = crm_next_id 10208 
     EXEC @PhoneId = crm_next_id 14 


      INSERT INTO PhoneLink 
      (
       PLink_LinkID, PLink_PhoneId, PLink_CreatedBy, PLink_CreatedDate, PLink_UpdatedDate, 
       PLink_TimeStamp, PLink_EntityID, PLink_RecordID, PLink_Type 
      ) 
      VALUES 
      (
       @PhoneLinkID, @PhoneId, '1', GETDATE(), GETDATE(), 
       GETDATE(), @cf_PLink_EntityID, @cf_PLink_RecordID, 'Fax' 
      )   


     --Get next available row into variables 
     FETCH NEXT FROM CompanyFaxLinkCursor INTO @cf_PLink_LinkID, @cf_PLink_PhoneID, @cf_PLink_CreatedBy, @cf_PLink_CreatedDate, 
             @cf_PLink_UpdatedDate, @cf_PLink_TimeStamp, @cf_PLink_EntityID, @cf_PLink_RecordID, @cf_PLink_Type 

     END 

     CLOSE CompanyFaxLinkCursor 
     DEALLOCATE CompanyFaxLinkCursor 



------- Company Phone (Fax) Cursor -------------------------------------------------- 
     -- Declare Variables 
     DECLARE @cf_Phon_PhoneId NVARCHAR(30) 
     DECLARE @cf_Phon_Number NVARCHAR(30) 
     DECLARE @cf_Phon_CreatedBy NVARCHAR(30) 
     DECLARE @cf_Phon_CreatedDate NVARCHAR(30) 
     DECLARE @cf_Phon_UpdatedBy NVARCHAR(30) 
     DECLARE @cf_Phon_UpdatedDate NVARCHAR(30) 
     DECLARE @cf_Phon_TimeStamp NVARCHAR(30) 


     --Declare Cursor 
     DECLARE CompanyFaxCursor CURSOR FOR 
     SELECT Phon_PhoneId, Phon_Number, Phon_CreatedBy, Phon_CreatedDate, Phon_UpdatedBy, Phon_UpdatedDate, Phon_TimeStamp 
     FROM Phone 
     INNER JOIN PhoneLink 
     ON Phon_PhoneId = PLink_PhoneId 
     AND PLink_RecordID = @Comp_CompanyId 
     AND Plink_EntityID = '5' 
     AND Plink_Type = 'Fax' 
     AND Plink_Deleted is null 
     AND Phon_Deleted is null 


     --Open Cursor & fetch 1st row into variables 
     OPEN CompanyFaxCursor 
     FETCH NEXT FROM CompanyFaxCursor INTO @cf_Phon_PhoneId, @cf_Phon_Number, @cf_Phon_CreatedBy, @cf_Phon_CreatedDate, 
             @cf_Phon_UpdatedBy, @cf_Phon_UpdatedDate, @cf_Phon_TimeStamp 


     --Fetch successful 
     --Check for a new row 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 


     INSERT INTO Phone 
     (
      Phon_PhoneId, Phon_Number, Phon_CreatedBy, Phon_CreatedDate, Phon_UpdatedBy, Phon_UpdatedDate, Phon_TimeStamp 
     ) 
     VALUES 
     (
      @PhoneID, @cf_Phon_Number, '1', GETDATE(), '1', GETDATE(), GETDATE() 
     ) 


     --Get next available row into variables 
     FETCH NEXT FROM CompanyFaxCursor INTO @cf_Phon_PhoneId, @cf_Phon_Number, @cf_Phon_CreatedBy, @cf_Phon_CreatedDate, 
             @cf_Phon_UpdatedBy, @cf_Phon_UpdatedDate, @cf_Phon_TimeStamp 

     END 

     CLOSE CompanyFaxCursor 
     DEALLOCATE CompanyFaxCursor 

我的表结构如下:

电话链接表:

PLink_LinkID | PLink_EntityID | PLink_RecordID | PLink_Type | PLink_PhoneID 
------------------------------------------------------------------------- 
1   | 5    | 2    | Business | 1 
2   | 5    | 3    | Fax  | 2 
3   | 5    | 2    | Fax  | 3 
4   | 5    | 3    | Business | 4 

电话表:

​​3210

现在,每当我执行我会得到下图所示的错误此存储过程。我试图以先插入手机只与公司的链接交换每Phone表以其PhoneLink表,但我还是得到了以下错误重复两次:

消息547,级别16,状态0,过程DuplicateCompanyInfo ,行150(假设)

INSERT语句与FOREIGN KEY约束“FK_PhoneLink_PhoneId”冲突。冲突发生在数据库“CRM”中,表“dbo.Phone”,列'Phon_PhoneId'。

消息547,级别16,状态0,过程DuplicateCompanyInfo,160线(假定)

INSERT语句冲突与外键约束 “FK_PhoneLink_PhoneId”。冲突发生在数据库“CRM”中,表“dbo.Phone”,列'Phon_PhoneId'。

我知道这是一个非常直接的错误消息,但我无法修复它。我是SQL新手。请帮忙!

+1

请阅读如何创建[mcve]。您发布了很多代码,请仅关注与问题相关的代码。 –

+0

对不起,先生,我已经通过删除'Person_Phone'来编辑和缩短它,只留下'公司电话',是否可以? –

+1

我不是在问你,我是在问你。你的问题将有更好的机会得到更快,更准确的答案,越短越清晰。例如,我通常甚至不愿意阅读与您的问题一样长的问题,我相信我不是唯一的问题。请记住,我们都在业余时间,没有人能够通过计算器来回答问题。帮助我们尽可能简短,专注和可读地帮助您解决问题。 –

回答

0

您可以查看该命令所有的约束:

exec sp_helpconstraint 'mytable' 

好像有重复。

+0

我检查了PhoneLink表,它确实有外键约束,约束名称为FK_PhoneLink_PhoneID,status_enable为“enabled”,status_for_replication为“Is_For_Replication”,constraint_keys为“PLink_PhoneID”和REFERENCES CRM.dbo.Phone Phon_PhoneId)。问题是我不知道如何解决这个约束问题。我是SQL新手,可能会提出很容易解决的问题,并为此表示歉意。 –

+0

我已经upvoted&接受你的答案,因为我相信你已经帮我清除了一些困惑,但仍然希望你能指导我解决约束问题。谢谢 –

+0

我已经通过将'VALUES'中的所有'@c_PLink_EntityID,@ c_PLink_RecordID'更改为''5',@ companyid'来解决它,并且它现在完美运行。不管怎么说,还是要谢谢你! –

相关问题