如果数据已经存在,则在存储过程中进行验证

Doing validation in stored procedure if data already exist

我想创建一个存储过程,我想在其中检查我是否添加了 Bin no,如果存在于 table 中,它应该给我 验证消息 否则它应该工作

我试过如下但没有用

ALTER PROCEDURE [dbo].[sp_P_WMS_Stock_Adj_Val_Proc]
    (@Bin_no nvarchar(max)) 
AS BEGIN
    IF (@Bin_no = )
    BEGIN
          RAISERROR('Bin no already exist', 16, 1)
          RETURN
    END
    ELSE
    BEGIN
        SELECT DISTINCT 
            Location_Name + '-' +  convert(varchar, mkey) 
        FROM
            WMS_Storage_Bin 
        WHERE
            status = 'Confirmed' 
            AND location_name = @Bin_no
    END 
END

我正在使用 SQL Server 2005。

如果您确实必须在存储过程中执行此操作 - 然后使用此:

ALTER PROCEDURE dbo.ValidateWMSStock
    (@Bin_no nvarchar(max)) 
AS BEGIN
    IF EXISTS (SELECT * FROM dbo.WMS_Storage_Bin 
               WHERE location_name = @Bin_no)
    BEGIN
          RAISERROR('Bin no already exist', 16, 1)
          RETURN
    END
    ELSE
    BEGIN
        SELECT DISTINCT 
            Location_Name + '-' +  convert(varchar, mkey) 
        FROM
            WMS_Storage_Bin 
        WHERE
            status = 'Confirmed' 
            AND location_name = @Bin_no
    END 
END

但正如 Mitch Wheat 已经说过的那样——在该列上放置一个 唯一约束 可能要容易得多:

ALTER TABLE dbo.WMS_Storage_Bin
   ADD CONSTRAINT UQ_Location_Name UNIQUE(location_name)

设置唯一约束后,如果您尝试插入一个 location_name 已经存在的行,您将收到错误消息

Msg 2627, Level 14, State 1, Line xx
Violation of UNIQUE KEY constraint 'UQ_Location_Name'. Cannot insert duplicate key in object 'dbo.WMS_Storage_Bin'. The duplicate key value is (......).

更新:

我试过了 - 我相信我提供的代码可以工作 很好:

DECLARE @BinTable TABLE (ID INT NOT NULL, Location_Name NVARCHAR(100))

INSERT INTO @BinTable VALUES(1, N'A1112'), (2, N'A1113'), (3, N'A1114'), (4, N'A1121')

DECLARE @Bin_No NVARCHAR(MAX)

-- SET @Bin_No = N'A1112'  -- this prints "Bin already exists" as expected
SET @Bin_No = N'A4112'     -- this prints "Bin does *NOT* exist" as expected

IF EXISTS (SELECT * FROM @BinTable WHERE location_name = @Bin_no)
    PRINT 'Bin already exists'
ELSE
    PRINT 'Bin does *NOT* exist'