1

Я создал эту хранимую процедуру, которая принимает параметр @UpdType char(1). Процедура выполняется независимо от того, какой параметр вводится. Однако; хранимая процедура только завершает свою функцию, если параметр равен R или U.SQL - Ограничение входных параметров хранимой процедуры

Есть ли способ ограничить хранимую процедуру только для приема параметров 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 

ответ

3

Один из способов добавить простую проверку:

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 
2

У вас есть несколько вариантов.

Вариант 1: вернуть статус из хранимой процедуры и проверить допустимые значения на входе. Другими словами, что-то вроде этого:

if (@UPDTYPE NOT IN ('R', 'D')) 
begin 
    print 'Invalid argument'; 
    return(-1); 
end; 

Вариант 2: Используйте флаги вместо IsRUpd. Вы можете объявить это bit not null, чтобы ограничить ее двумя значениями.

Вариант 3: Создайте свой собственный пользовательский тип, который принимает только эти два значения.

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

+0

'НЕ INT'. Вы должны обрабатывать 'NULL' [Demo] (https://data.stackexchange.com/stackoverflow/query/451568) – lad2025

+0

Определенные пользователем типы имеют проблемы с ремонтопригодностью, поэтому принимая во внимание, что существует только два значения, используя бит с нулевым значением , как IsRead намного лучше. Использование бит лучше, чем проверка, поскольку у вас есть более четкий и четко определенный контракт для вашей хранимой процедуры - и любое недопустимое значение будет обнаружено в момент интерпретации, но не выполняется. – ironstone13

Смежные вопросы