2016-11-10 39 views
0

正しい構文を使用しているかどうかわかりませんが、1つのテーブルに入力しようとしていて、次に外部キーを持つ別のテーブルを入力しようとしています。 tbl1SentEmailsの主キーはtbl1Recipientsの外部キーとして使用されます。私はこれをストアドプロシージャに入れましたが、私は外部キーの制約を述べているエラーを受けています。これを修正する方法はありますか?ストアドプロシージャの外部キー制約

ストアドプロシージャのコード:

-- This is the sample script to test the SP 
-- An instance of the Table parameter type is created 
Declare @SampelData As [dbo].[SampleDataType] 
Declare @RecData As [dbo].[SampleRecType] 


Insert Into @SampelData(strEmailSendID, dtmSent, strSubject, strBody, strConversationID, strConversationTopic, strConversationIndex, dtmReplied, dtmOpened, dtmClicked, blnTrackOpens, blnTrackClicks, blnTrackReplies, lngMergeID, blnHide) 
Values ('ce4d29160fae4eba92c7d233723f6f59', '2016-11-08', 'strSubject', 'strBody','strConversationID', 'strConversationTopic', 'strConversationIndex', '2016-11-08', '2016-11-08', '2016-11-08', 'true', 'true', 'true', 69164, 'true') 
SELECT * FROM @SampelData 
Insert Into RecData(strEmailSendID, strEmailAddress, strDisplayName, strRecipientType) 
Values ('ce4d29160fae4eba92c7d233723f6f59','[email protected]','Alvindra Dutt','TO') 
Select * From @RecData 
-- we then call the SP to store the values 
Exec SampleProcedure @SampelData,@RecData 

私はMVCアプリケーションからこのストアドプロシージャを呼び出すことがありますので、私はちょうどtbl1SentEmailsのためにPKのための生の値を渡しています。しかし、とにかく私はテーブルのstrEmailSendIDを渡すことができますし、それをtbl1Recipientsに入力することはできますか?

これはテーブルタイプのために作成されています

-- Create a table data type 
CREATE TYPE [dbo].[SampleDataType] As Table 
(
--This type has structure similar to the DB table 
--SampleString Nvarchar(64) Not Null -- Having one String 
--, SampleDate Date -- and one Date 
strEmailSendID nvarchar(255) not null, 
dtmSent datetime not null, 
strSubject nvarchar(255) null, 
strBody nvarchar(255) null, 
strConversationID nvarchar(255) null, 
strConversationTopic nvarchar(1000) null, 
strConversationIndex nvarchar(max) null, 
dtmReplied datetime null, 
dtmOpened datetime null, 
dtmClicked datetime null, 
blnTrackOpens bit null, 
blnTrackClicks bit null, 
blnTrackReplies bit null, 
lngMergeID bigint not null, 
blnHide bit null, 
lngLatestEventID bigint null, 
strClickRespone nvarchar(50) null, 
dtmClickResponse datetime null 
) 


CREATE TYPE [dbo].[SampleRecType] As Table 
(
strEmailSendID nvarchar(255) not null, 
strEmailAddress nvarchar(255) not null, 
strDisplayName nvarchar(255) null, 
strRecipientType nvarchar(5) not null 
) 

コードの実際のストアドプロシージャのために:

--This is the Stored Procedure 
CREATE PROCEDURE [dbo].[SampleProcedure] 
(
-- which accepts one table value parameter. 
-- It should be noted that the parameter is readonly 
@Sample As [dbo].[SampleDataType] Readonly, @Rec As [dbo].[SampleRecType] ReadOnly 
) 
AS 

Begin 
-- We simply insert values into the DB table from the parameter 
-- The table value parameter can be used like a table with only read rights 

--Insert Into SampleTable(SampleString,SampleDate) 
--Select SampleString,SampleDate From @Sample 
Insert Into tbl1Recipients(strEmailSendID, strEmailAddress, strDisplayName, strRecipientType) 
Select * From @Rec 
Insert Into tbl1SentEmails(strEmailSendID, dtmSent, strSubject, strBody, strConversationID, strConversationTopic, strConversationIndex, dtmReplied, dtmOpened, dtmClicked, blnTrackOpens, blnTrackClicks, blnTrackReplies, lngMergeID, blnHide, lngLatestEventID, strClickResponse, dtmClickResponse) 
Select * From @Sample 
End 

コード表について:

USE [standss_tracking_us_sandbox] 
GO 

/****** Object: Table [dbo].[tbl1Recipients] Script Date: 10/11/2016 5:24:52 p.m. ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[tbl1Recipients](
[strEmailSendID] [nvarchar](255) NOT NULL, 
[lngRecipientNo] [bigint] IDENTITY(1,1) NOT NULL, 
[strEmailAddress] [nvarchar](255) NOT NULL, 
[strDisplayName] [nvarchar](255) NULL, 
[strRecipientType] [nvarchar](5) NOT NULL, 
[ts] [timestamp] NOT NULL, 
CONSTRAINT [PK_tbl1Recipients] PRIMARY KEY CLUSTERED 
(
[strEmailSendID] ASC, 
[lngRecipientNo] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 

GO 

ALTER TABLE [dbo].[tbl1Recipients] WITH CHECK ADD CONSTRAINT  [FK_tbl1Recipients_tbl1SentEmails] FOREIGN KEY([strEmailSendID]) 
REFERENCES [dbo].[tbl1SentEmails] ([strEmailSendID]) 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[tbl1Recipients] CHECK CONSTRAINT [FK_tbl1Recipients_tbl1SentEmails] 
GO 


/****** Object: Table [dbo].[tbl1SentEmails] Script Date: 10/11/2016  5:28:42 p.m. ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[tbl1SentEmails](
[strEmailSendID] [nvarchar](255) NOT NULL, 
[dtmSent] [datetime] NOT NULL, 
[strSubject] [nvarchar](255) NULL, 
[strBody] [nvarchar](255) NULL, 
[strConversationID] [nvarchar](255) NULL, 
[strConversationTopic] [nvarchar](1000) NULL, 
[strConversationIndex] [nvarchar](max) NULL, 
[dtmReplied] [datetime] NULL, 
[dtmOpened] [datetime] NULL, 
[dtmClicked] [datetime] NULL, 
[blnTrackOpens] [bit] NULL, 
[blnTrackClicks] [bit] NULL, 
[blnTrackReplies] [bit] NULL, 
[ts] [timestamp] NOT NULL, 
[lngMergeID] [bigint] NOT NULL, 
[blnHide] [bit] NULL, 
[lngLatestEventID] [bigint] NULL, 
[strClickResponse] [nvarchar](50) NULL, 
[dtmClickResponse] [datetime] NULL, 
CONSTRAINT [PK_tbl1SentEmails] PRIMARY KEY CLUSTERED 
(
[strEmailSendID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 

GO 

ALTER TABLE [dbo].[tbl1SentEmails] WITH CHECK ADD CONSTRAINT [FK_tbl1SentEmails_tbl1Merges] FOREIGN KEY([lngMergeID]) 
REFERENCES [dbo].[tbl1Merges] ([lngMergeID]) 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[tbl1SentEmails] CHECK CONSTRAINT  [FK_tbl1SentEmails_tbl1Merges] 
GO 
+0

私たちは、テーブルを表示しますか?どこにエラーが出るのかはわかりません。 –

+0

@JuanCarlosOropeza、私は 'tbl1Recipients'に挿入したいときに2番目の' INSERT'文でエラーを受け取ります。 'tbl1SentEmails'のPKである' strEmailSendID'というフィールドがあり、 'tbl1Recipients'にFKとして機能します。 –

+0

あなたが提供するステートメントは' tbl1Recipients'や 'tbl1SentEmails'ではなくテーブル変数に挿入するだけです – mendosi

答えて

1

以下のようにストアドプロシージャを変更してください。それはあなたのために動作します

ALTER PROCEDURE [dbo].[SampleProcedure] 
(
    @Sample As [dbo].[SampleDataType] Readonly, 
    @Rec As [dbo].[SampleRecType] ReadOnly 
) 
AS 
Begin 

    Insert Into tbl1SentEmails(strEmailSendID, dtmSent, strSubject, strBody, strConversationID, strConversationTopic, strConversationIndex, dtmReplied, dtmOpened, dtmClicked, blnTrackOpens, blnTrackClicks, blnTrackReplies, lngMergeID, blnHide, lngLatestEventID, strClickResponse, dtmClickResponse) 
    Select * From @Sample 

    Insert Into tbl1Recipients(strEmailSendID, strEmailAddress, strDisplayName, strRecipientType) 
    Select * From @Rec 

End 
+0

私はSSMSからプロシージャを削除してから、これで再作成しました。ありがとうマンシ! –

1

それがどのように見えますストアドプロシージャがtbl1SentEmailsに挿入される前にtbl1Recipientsに挿入されています。 SQL Server does not support deferred foreign-key constraintsを参照するため、行を参照するテーブルに追加する前に親テーブルに行を追加する必要があります。

ストアドプロシージャのINSERTステートメントを切り替えてみてください。