SQL新增重复记录校验:Northwind库AddNewProduct存储过程报错实现咨询
存储过程问题排查与修复方案
现有代码的核心问题
- 判断逻辑错误:原代码中的判断条件
If @ProductName = @ProductName为恒真表达式(只要传入的@ProductName不为NULL就永远成立),所以永远会执行插入逻辑,不可能触发错误分支 - 缺少重复值校验逻辑:代码完全没有查询Products表中已有的ProductName记录,根本无法识别重复插入的场景
修复后的完整代码
USE [Northwind] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[AddNewProduct] @ProductName nvarchar(40), @SupplierID int, @CategoryID int, @QuantityPerUnit nvarchar(20), @UnitPrice money, @UnitsInStock smallint, @UnitsOnOrder smallint, @ReorderLevel smallint, @Discontinued bit as SET NOCOUNT ON; DECLARE @count int; -- 校验产品名称是否已存在 SELECT @count = COUNT(*) FROM Products WHERE ProductName = @ProductName; IF @count = 0 BEGIN INSERT INTO Products ( ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued ) VALUES ( @ProductName, @SupplierID, @CategoryID, @QuantityPerUnit, @UnitPrice, @UnitsInStock, @UnitsOnOrder, @ReorderLevel, @Discontinued ) END ELSE BEGIN DECLARE @ErrorMessage NVARCHAR(4000); SET @ErrorMessage = '产品名称已存在,禁止重复插入'; RAISERROR (@ErrorMessage, 16, 1); END GO
逻辑说明
- 插入操作执行前先统计Products表中与传入@ProductName同名的记录数量
- 若统计值为0说明无重复,执行插入操作
- 若统计值大于0说明名称重复,直接抛出自定义错误提示
内容的提问来源于stack exchange,提问作者Łukasz Kraśniak
相关产品推荐
相关产品推荐

