2016-04-25 29 views
0

私の仕事は、ストアドプロシージャを使用して企業情報を複製することです。私は技術的なリードから注文として私の仕事を完了するためにカーソルを使用する必要があります。私はSPを実行するたびにこのエラーが発生します。私の前の質問で言及した人、住所などの他のテーブルは解決されました。今残っているのは電話&私に頭痛を与えている電話リンクテーブルです。INSERTステートメントがFOREIGN KEY制約(Cursor)と競合しました

P/S:

  • 実体識別子= 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

。私は最初の企業へのリンクだけを携帯電話に挿入するために、そのPhoneLinkテーブルですべてのPhoneテーブルを交換しようとしましたが、私はまだ、次のエラーを二回繰り返しました:

メッセージ547、レベル16、状態0、プロシージャDuplicateCompanyInfo 、Line 150(Assumed)

INSERTステートメントがFOREIGN KEY制約 "FK_PhoneLink_PhoneId"と競合しました。競合は、データベース "CRM"、テーブル "dbo.Phone"、列 "Phon_PhoneId"で発生しました。

メッセージ547、レベル16、状態0、プロシージャDuplicateCompanyInfo、ライン160(想定)

FOREIGN KEY制約 "FK_PhoneLink_PhoneId" と競合INSERT文。競合は、データベース "CRM"、テーブル "dbo.Phone"、列 "Phon_PhoneId"で発生しました。

非常に単純なエラーメッセージですが、修正できません。私はSQLで新しいです。助けてください!

+1

[mcve]の作成方法をお読みください。あなたは多くのコードを投稿しました。質問に関連するコードだけに注目してください。 –

+0

申し訳ありません、私は 'Person_Phone'を削除して編集して短縮し、' Company Phone'だけ残しました、それは大丈夫ですか? –

+1

私はあなたに私のために頼んでいない、私はあなたのために頼んでいる。あなたの質問はより短く、より明確に、より速く、より正確な回答を得る良い機会になります。私は、たとえば、あなたのものと同じくらい長い質問を読んでも大したことはありません。私は唯一の人ではないと確信しています。私たちは余裕をもってすべてここにいることを覚えておいてください。誰も、stackoverflowの質問に答えるための支払いを受けていません。できるだけ短く、集中的に、そして判読可能な形でご質問をお待ちしております。 –

答えて

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

私はいくつかの混乱を取り除いてくれたと信じているので、あなたの答えをアップアップして受け入れましたが、まだ制約の問題を解決するために私を導いてくれることを願っています。ありがとう –

+0

私は 'VALUES'の' @c_PLink_EntityID、@ c_PLink_RecordID'を ''5 '、@ companyid'に変更して解決しました。とにかくありがとう! –

関連する問題