You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:45:03