SQL - 限制存储过程输入参数

问题描述:

我已经创建了此存储过程,它接受参数@UpdType char(1)。无论输入什么参数,该过程都会执行。然而;如果参数是RU,则存储过程仅完成其功能。SQL - 限制存储过程输入参数

是否有一种方法可以将存储过程限制为只接受参数RU作为输入?

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 

的一种方式是添加简单的验证:

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:创建您自己的只接受这两个值的用户定义类型。

在我看来,第一种方法是最容易实现的方法。而且,在存储过程中进行适当的错误处理有许多更长期的好处。

+0

'NOT INT'。您应该处理'NULL' [Demo](https://data.stackexchange.com/stackoverflow/query/451568) – lad2025

+0

用户定义类型具有已知的可维护性问题,因此考虑到只有两个值,使用非空值位,就像IsRead好得多。使用位比验证要好,因为你的存储过程有一个更清晰明确的合同 - 并且在解释时检测到任何无效值,而不是运行。 – ironstone13