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

时间:2015-11-26 05:50:16

标签: sql-server-2005

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

我尝试过如下但不起作用

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。

1 个答案:

答案 0 :(得分:2)

如果你真的必须在存储过程中执行此操作 - 那么请使用:

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的行,则会收到错误

  

Ms 2627,Level 14,State 1,Line xx
  违反UNIQUE KEY约束' UQ_Location_Name'。无法在对象' dbo.WMS_Storage_Bin'中插入重复的密钥。重复键值为(......)。

<强>更新

我试过了 - 我相信我提供的代码很好

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'
相关问题