SQL - ограничение входных параметров хранимых процедур
Я создал эту хранимую процедуру, которая принимает параметр @UpdType char(1)
, Процедура выполняется независимо от того, какой параметр введен. Тем не мение; хранимая процедура завершает свою функцию, только если параметр R
или же U
,
Есть ли способ ограничить хранимую процедуру только принятием параметров R
или же U
в качестве входных данных?
CREATE PROCEDURE UPDATECATS @UPDTYPE CHAR(1)
AS
BEGIN
IF @UPDTYPE = 'U' --UPDATE TO NEW CATEGORIES IF PARAMETER IS R
BEGIN
UPDATE CATLEVEL1
SET CAT1DESC = 'LABORATORY EQUIPMENT'
WHERE CAT1DESC = 'MEDICAL & ALLIED EQUIPMENT'
UPDATE CATLEVEL1
SET CAT1DESC = 'MACHINERY & CAMPUS EQUIPMENT'
WHERE CAT1DESC = 'OTHER MACHINERY & EQUIPMENT'
END
IF @UPDTYPE = 'R' --REVERSE TO OLD CATEGORIES IF THE PARAMETER IS U
BEGIN
UPDATE CATLEVEL1
SET CAT1DESC = 'MEDICAL & ALLIED EQUIPMENT'
WHERE CAT1DESC = 'LABORATORY EQUIPMENT'
UPDATE CATLEVEL1
SET CAT1DESC = 'OTHER MACHINERY & EQUIPMENT'
WHERE CAT1DESC = 'MACHINERY & CAMPUS EQUIPMENT'
END
IF @UPDTYPE = 'R' OR @UPDTYPE = 'U' --UPDATE THE CATEGORIES IN THE ASSETS TABLE
BEGIN
UPDATE ASSETS
SET ASSETS.CAT3 = B.CATLEVEL3LINK
FROM ASSETS A
LEFT JOIN ASSETDESC B ON A.ASDES = B.ASSETDESCRIPTION
UPDATE ASSETS
SET ASSETS.CAT2 = B.CATLEVEL2LINK
FROM ASSETS A
LEFT JOIN CATLEVEL3 B ON A.CAT3 = B.CAT3DESC
UPDATE ASSETS
SET ASSETS.CAT1 = B.CATLEVEL1LINK
FROM ASSETS A
LEFT JOIN CATLEVEL2 B ON A.CAT2 = B.CAT2DESC
END
END
2 ответа
Одним из способов является добавление простой проверки:
CREATE PROCEDURE UPDATECATS @UPDTYPE CHAR(1)
AS
BEGIN
IF @UPDTYPE IN ('R', 'U')
BEGIN
-- your code
END
ELSE
BEGIN
-- RAISERROR/THROW
END
END
или же:
CREATE PROCEDURE UPDATECATS @UPDTYPE CHAR(1)
AS
BEGIN
IF (@UPDTYPE NOT IN ('R', 'U')) OR (@UPDTYPE IS NULL)
RAISERROR/THROW ..
--rest your code
END
У вас есть несколько вариантов.
Вариант 1. Возвращение статуса из хранимой процедуры и проверка допустимых значений на входе. Другими словами, что-то вроде этого:
if (@UPDTYPE NOT IN ('R', 'D'))
begin
print 'Invalid argument';
return(-1);
end;
Вариант 2: используйте флаги IsRUpd
, Вы можете объявить это bit not null
ограничить его двумя значениями.
Вариант 3. Создайте свой собственный определяемый пользователем тип, который принимает только эти два значения.
На мой взгляд, первый метод - самый простой для реализации. И правильная обработка ошибок в хранимых процедурах имеет много долгосрочных преимуществ.