Enter one record using 'if Not Exists'
I'm trying to find one record in the Meeting table that contains the same Modified_user_id, assigned_user_id, Name, date_start,date_end, created_by as the record that's being saved. Th开发者_JS百科e new record should only be added if there isn't already one in the meeting table.
When I run this, the record is added even if there are already matching records in the table.
What am I missing?
Thanks for your help.
ALTER PROCEDURE Add_Follow_up_From_Lead
@MODIFIED_USER_ID AS VARCHAR (250) = MODIFIED_USER_ID ,
@ASSIGNED_USER_ID AS VARCHAR (250) =MODIFIED_USER_ID,
@NAME nvarchar (50) = NAME,
@DATE_START AS VARCHAR (250) = DATE_START,
@DATE_END AS VARCHAR (250) = DATE_END,
@CREATED_BY AS VARCHAR (250) = CREATED_BY
AS
BEGIN
SET NOCOUNT ON;
IF NOT (EXISTS (select name from meetings where name = @name)
AND
EXISTS (SELECT DATE_START FROM MEETINGS WHERE DATE_START = @DATE_START)
AND
EXISTS (SELECT DATE_END FROM MEETINGS WHERE DATE_END = @DATE_END)
AND
EXISTS (SELECT CREATED_BY FROM MEETINGS WHERE CREATED_BY = @CREATED_BY))
insert into meetings(MODIFIED_USER_ID,ASSIGNED_USER_ID,NAME,
DATE_START ,DATE_END,CREATED_BY )
,TIME_START,STATUS,duration_hours,duration_minutes,REMINDER_TIME)
select top 1 l.modified_USER_ID,l.modified_USER_ID,first_name +' '+Last_name +' 'as NAME,FOLLOW_UP_DATE_C as Date_start,FOLLOW_UP_DATE_C as Date_end ,L.created_by
from leads_cstm lc
join leads l on l.id = lc.id_c where FOLLOW_UP_DATE_C >getdate()
order by l.date_modified Desc
END GO
Your IF condition isn't checking for one row that has the same values as the new row. It will return true if either one of those values is present anywhere in the table. You are better off creating a unique key (Modified_user_id, assigned_user_id, Name, date_start,date_end, created_by) on the Meetings table, if it satisfies any other constraints that you may have. Then you can just run a simple insert query as
INSERT IF NOT EXISTS INTO Meetings VALUES(.....)
If not exists(select name from meetings where(name=@name)and(date_start=@date_start)and....etc)
Begin
Insert into meetings(...)values(....)
End
For SQL Server
It's easier and safer to let this error than check first. The error occurs when there is a unique constraint/index on NAME, DATE_START, DATE_END, CREATED_BY
which there should be
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
Why are you passing in variables and not using them?
精彩评论