Если вы действительно необходимо сделать это в хранимая процедура - использовать это:
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
Но Митч Пшеница уже сказал - это, вероятно, гораздо проще просто поставить ограничение уникальности на этой колонке:
ALTER TABLE dbo.WMS_Storage_Bin
ADD CONSTRAINT UQ_Location_Name UNIQUE(location_name)
После того, как уникальное ограничение на месте, если вы попытаетесь вставить строку с location_name
, что уже существует, вы получите сообщение об ошибке
Msg 2627, Level 14, State 1, Line хх
Нарушение ограничения UNIQUE KEY 'UQ_Location_Name'. Невозможно вставить дубликат ключа в объект «dbo.WMS_Storage_Bin». Значение дублирующегося ключа (......).
Update:
Я попытался это - я считаю, что код я представил работу просто отлично:
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'
использовать уникальное ограничение ...... а не триггер –
@MitchWheat: можете ли вы предложить, как это использовать? так как я не знаком с этим. извините за это – BNN
Я бы начал с ввода «уникального ограничения SQL Server». в поисковую систему ... –