2

我创建了这个接受参数的存储过程@UpdType char(1)。无论输入什么参数,程序都会执行。然而; R存储过程仅在参数为或时才完成其功能U

有没有办法将存储过程限制为只接受参数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
4

2 回答 2

4

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

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
于 2016-03-16T18:33:12.747 回答
2

你有一些选择。

选项 1:从存储过程返回状态,并检查输入的有效值。换句话说,是这样的:

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

选项 2:改用标志IsRUpd。您可以将其声明为将bit not null其限制为两个值。

选项 3:创建您自己的仅接受这两个值的用户定义类型。

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

于 2016-03-16T18:35:51.733 回答