2016-11-10 3 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. Тем не менее, есть ли в любом случае я могу получить 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, я получаю сообщение об ошибке во втором заявлении 'INSERT', когда я хочу вставить в' tbl1Recipients'. Существует одно поле, называемое 'strEmailSendID', которое является PK для' tbl1SentEmails' и действует как FK в 'tbl1Recipients' –

+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

Похоже хранимая процедура вводится в tbl1Recipients перед вставкой в ​​tbl1SentEmails. SQL Server does not support deferred foreign-key constraints, поэтому вам нужно добавить строку в родительскую таблицу, прежде чем добавлять ее в таблицу, которая ссылается на нее.

Попробуйте переключить операторы INSERT в хранимой процедуре.

Смежные вопросы