【问题标题】:SQL - Limiting stored procedure input parametersSQL - 限制存储过程输入参数
【发布时间】:2016-03-16 18:31:46
【问题描述】:

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

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

【问题讨论】:

    标签: sql sql-server stored-procedures sql-server-2012 input-parameters


    【解决方案1】:

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

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

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

      【讨论】:

      • NOT INT。你应该处理NULLDemo
      • 用户定义的类型存在已知的可维护性问题,因此考虑到只有两个值,使用不可为空的位,如 IsRead 会好得多。使用 bit 比验证要好,因为您的存储过程有一个更清晰且定义明确的协定 - 任何无效值都将在解释时被检测到,而不是运行。
      猜你喜欢
      • 2010-09-12
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多