【问题标题】:Add a IF ...ELSE statement to stored procedure to skip duplicate primary keys向存储过程添加 IF ...ELSE 语句以跳过重复的主键
【发布时间】:2012-05-09 09:10:42
【问题描述】:

我在我的物理 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)

【问题讨论】:

    标签: sql-server tsql stored-procedures


    【解决方案1】:
    CREATE PROCEDURE InsertProc
        (
        @id int, 
        @to nvarchar(100), 
        @from nvarchar(100), 
        @subject nvarchar(100), 
        @date datetime
        )
        AS
        IF NOT EXISTS (SELECT NULL 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
    

    如果你真的想更新记录,如果已经存在,如果不存在则插入,模式如下:

    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
    

    【讨论】:

      【解决方案2】:
      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)
      

      另一种方法是使用MERGE 命令。

      this thread on SO to know more

      【讨论】:

      • 设置...? ((at)id, (at)to, (at)from, (at)subject, (at)date) 会进去吗?
      • Msg 102,级别 15,状态 31,过程 InsertUpdateProc,第 11 行 '(' 附近的语法错误。:我收到此错误
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        试试这个代码

        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
        

        【讨论】:

          猜你喜欢
          • 2013-11-18
          • 1970-01-01
          • 1970-01-01
          • 2015-12-24
          • 1970-01-01
          • 2014-03-09
          • 1970-01-01
          • 1970-01-01
          • 2019-02-27
          相关资源
          最近更新 更多