【问题标题】:How to avoid duplicate records using stored procedure [duplicate]如何使用存储过程避免重复记录[重复]
【发布时间】:2018-05-03 04:04:53
【问题描述】:

我想写一个存储过程来将数据插入到表中,并检查相同的数据是否已经存在?

如果是,则异常抛出已存在。但我不知道应该在哪里添加异常。请帮忙。

ALTER PROCEDURE [dbo].[datakutipantest1]
AS
BEGIN
    DECLARE @ModifiedDate datetime = GETDATE()

    INSERT INTO spk_DataKutipan ([NO_BIL], [NO_AKAUN], [TKH_BAYAR],
  [STESYEN], [AMAUN_BAYAR], [JENIS_BAYAR], [NO_RESIT], [STATUS], [NO_VOT], [TKH_MODIFIKASI])
        SELECT
            D.BillNo,
            D.AccountNo,
            D.TxDate,
            D.ReferenceCode,
            D.Amount,
            PaymentTypeId,
            D.ReferenceNo,
            D.Status,
            D.RevenueCode,
            @ModifiedDate
        FROM 
            (SELECT
                 B.ComponentId,
                 B.AccountNo,
                 B.BillNo,
                 B.RevenueCode,
                 B.Amount,
                 B.TxId,
                 ReferenceNo,
                 B.ReferenceCode,
                 status,
                 TxDate
             FROM 
                 (SELECT
                      A.ComponentId,
                      A.TxId,
                      AccountNo,
                      BillNo,
                      RevenueCode,
                      Amount,
                      C.ReferenceCode
                  FROM 
                      rcs_TxBillItem A
                  INNER JOIN 
                      (SELECT
                           ComponentId,
                           ComponentName,
                           ReferenceCode
                       FROM 
                           rcs_Component
                       WHERE  
                           IsDeleted = 0) C ON C.ComponentId = A.ComponentId) B
                  INNER JOIN  
                      rcs_TxBill P ON P.TxId = B.TxId) D

             INNER JOIN 
                 rcs_TxBillPayment E ON E.TxId = D.TxId
END
GO

【问题讨论】:

  • spk_DataKutipan 表中是否有任何唯一键?如果你有唯一键,当你尝试插入重复时,SQL 会自动抛出错误

标签: sql-server stored-procedures


【解决方案1】:
CREATE PROCEDURE [dbo].[Useradd]
      @username varchar(20),
      @pword nvarchar(20),
      @empname varchar(20),
      @email nvarchar(50),
      @designation varchar(20),
      @reportto varchar(20) AS
  IF (SELECT COUNT(*) FROM Users WHERE username= @username) < 1
    BEGIN   
      INSERT INTO Users(username,pword,empname,email,designation,reportto)    
      VALUES(@username,@pword,@empname,@email,@designation,@reportto)
    END

【讨论】:

    【解决方案2】:

    考虑使用 MERGE

    MERGE <target_table> [AS TARGET]
    USING <table_source> [AS SOURCE]
    ON <search_condition> --For example ColumnSource = ColumnTable
    WHEN MATCHED --Rows already exist
       THEN UPDATE target_table SET ... --Do Update for example
    WHEN NOT MATCHED BY TARGET --Rows not exist on Target Table
       THEN INSERT(...) VALUES(...) --Do Insert for example
    WHEN NOT MATCHED BY SOURCE --Rows not exist on Source table but exists on Target Table
       THEN DELETE ... --Do Delete for example
    

    MERGE 语句基本上根据您指定的条件以及来自源的数据是否已存在于目标中,将来自源结果集的数据合并到目标表中。新的 SQL 命令将条件 INSERT、UPDATE 和 DELETE 命令序列组合在单个原子语句中,具体取决于记录的存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多