我想创建一个存储过程,我想检查是否添加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。
答案 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'