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. Создайте свой собственный определяемый пользователем тип, который принимает только эти два значения.

На мой взгляд, первый метод - самый простой для реализации. И правильная обработка ошибок в хранимых процедурах имеет много долгосрочных преимуществ.

Другие вопросы по тегам