为什么不更新查询工作?

时间:2016-03-18 05:40:39

标签: sql sql-server sql-server-2008 tsql

我写了一个存储过程来更新记录。它提到每个年度每个BPS的工资明细,同一年内同一个BPS不能存在2次,即

BPS     Year
01      2014
02      2015
02      2015  (wrong)

此存储过程不起作用。

IF EXISTS (SELECT * FROM Setup.SalaryChart WHERE SalaryChartID = @SalaryChartID)
BEGIN
      IF EXISTS(SELECT * FROM Setup.SalaryChart 
                WHERE BPS = @BPS AND Year_ID = @Year_ID 
                  AND SalaryChartID != @SalaryChartID )
      BEGIN
            RAISERROR('Record already exists for selected BPS',16,1) 
            RETURN  
      END
      ELSE
        IF EXISTS(SELECT * FROM Setup.SalaryChart 
                  WHERE BPS = @BPS AND Year_ID = @Year_ID 
                    AND SalaryChartID = @SalaryChartID)
        BEGIN
            --UPDATE OF THE RECORD
            UPDATE Setup.SalaryChart
            SET BPS = @BPS,
                Year_ID = @Year_ID,
                FromDate = @FromDate,
                InitialSalary = @InitialSalary,
                Increment = @Increment,
                MaxSalary = @MaxSalary,
                IsActive = @IsActive,
                SystemUser_ID = @SystemUser_ID
            WHERE 
                SalaryChartID = @SalaryChartID
        END
  END

更新:

例如:

我有记录

BPS   Year   Salary     Bonus
01    2015    $100       $1

现在我更新此记录以仅更改奖励数字然后它将在EXISTS检查中失败。

1 个答案:

答案 0 :(得分:1)

正确的方式:

最简单的方法是在桌面上添加UNIQUE约束。

ALTER TABLE Setup.SalaryChart
ADD CONSTRAINT uc_SalaryChart UNIQUE(BPS, [Year]);  -- probably also SalaryChartID

自定义检查可能更慢且容易出错。

对于您的SP,您应该使用IF cond ELSE。我没有看到IF cond ELSE cond ...

的观点