Sql server 向存储过程添加IF…ELSE语句以跳过重复的主键

Sql server 向存储过程添加IF…ELSE语句以跳过重复的主键,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,在我的物理C#代码中有一个try-catch,当出现错误时,它会跳过这个插入过程,并继续循环以填充数据库。然而,这是一种糟糕的编码实践 因此,我想在下面的存储过程中添加一个IF语句,如果主键已经存在,该语句将跳过。我的主键是@id 我该怎么办 CREATE PROCEDURE InsertProc ( @id int, @to nvarchar(100), @from nvarchar(100), @subject nvarchar(100),

在我的物理C#代码中有一个try-catch,当出现错误时,它会跳过这个插入过程,并继续循环以填充数据库。然而,这是一种糟糕的编码实践

因此,我想在下面的存储过程中添加一个
IF
语句,如果主键已经存在,该语句将跳过。我的主键是
@id

我该怎么办

CREATE PROCEDURE InsertProc
    (
    @id int, 
    @to nvarchar(100), 
    @from nvarchar(100), 
    @subject nvarchar(100), 
    @date datetime
    )
AS
    INSERT INTO Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date) 
    VALUES (@id, @to, @from, @subject, @date)
如果确实要更新记录(如果已存在)并插入(如果不存在),则模式如下:

CREATE PROCEDURE InsertProc
    (
       @id int, 
       @to nvarchar(100), 
       @from nvarchar(100), 
       @subject nvarchar(100), 
       @date datetime
    )
    AS
       UPDATE Emails_Log
          SET e_To = @to, 
              e_From = @from, 
              e_Subject = @subject, 
              e_Date = @date
        WHERE Email_ID = @ID
       -- If there was no update it means that @ID does not exist,
       -- So we proceede with insert
       IF @@ROWCOUNT = 0
       BEGIN
          INSERT INTO Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date) 
               VALUES (@id, @to, @from, @subject, @date)
       END
另一种方法是使用命令

看看。

试试这个代码

CREATE PROCEDURE InsertProc
(
@id int, 
@to nvarchar(100), 
@from nvarchar(100), 
@subject nvarchar(100), 
@date datetime
)
AS
IF NOT EXISTS (SELECT Email_ID From Emails_Log Where Email_ID = @id)
BEGIN
    INSERT INTO Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date) 
        VALUES (@id, @to, @from, @subject, @date)
END

您可以检查表和中是否存在记录 在一条语句中插入记录


设置。。。?((at)id,(at)to,(at)from,(at)subject,(at)date)会进入那里吗?((at)subject,(at)date)会进入那里吗?Msg 102,15级,State 31,Procedure InsertUpdateProc,第11行“(”附近的语法不正确:我得到了这个错误
CREATE PROCEDURE InsertProc
    (
    @id int, 
    @to nvarchar(100), 
    @from nvarchar(100), 
    @subject nvarchar(100), 
    @date datetime
    )
    AS
    IF EXISTS(SELECT * From Emails_Log Where Email_ID = @id)
    UPDATE Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date) 
            SET e_To = @to, e_From = @from, e_Subject = @subject, e_Date = @date
            WHERE Email_ID = @id
    ELSE
    INSERT INTO Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date) 
            VALUES (@id, @to, @from, @subject, @date)
CREATE PROCEDURE InsertProc
(
@id int, 
@to nvarchar(100), 
@from nvarchar(100), 
@subject nvarchar(100), 
@date datetime
)
AS
IF NOT EXISTS (SELECT Email_ID From Emails_Log Where Email_ID = @id)
BEGIN
    INSERT INTO Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date) 
        VALUES (@id, @to, @from, @subject, @date)
END