如果数据已经存在,则在存储过程中进行验证
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'
我想创建一个存储过程,我想在其中检查我是否添加了 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'