【问题标题】:Data validation in stored procedure存储过程中的数据验证
【发布时间】:2013-11-25 21:25:26
【问题描述】:

我在 SQL Server 2008 中有一个存储过程。这个存储过程的工作非常简单——它在表中插入数据。该表中的一列是 varchar 类型,我对该列的数据验证有疑问。它接受客户端代码传入的任何值——这是预期的。有人告诉我不要在该列中插入“新”。客户端代码神秘地发送“新”作为存储过程参数,存储过程按原样插入该值。我知道这需要由客户端代码处理。但是,由于我负责表数据 - 我计划在存储过程发现“新”时抛出异常。我怎样才能做到这一点?

这是我的存储过程的格式:

ALTER PROCEDURE Object_Save
    @Id int = 0 OUTPUT              
    ,@OrderId int
    ,@OrderNumber varchar(20)
AS
    BEGIN TRY
        IF @Id = 0
            BEGIN
                INSERT INTO Table_Order(OrderId, OrderNumber) 
                VALUES (@OrderID, @OrderNumber)

                Set @Id = SCOPE_IDENTITY()
            END
        ELSE
            BEGIN
                -- Update
            END
    END TRY
    BEGIN CATCH
        exec error_catch
    END CATCH

【问题讨论】:

  • 您是否考虑过清理无效数据并对列本身添加检查约束?
  • 我考虑过约束,但我的经理不允许删除任何记录。我们有这个标记“已删除”,用于跟踪活动/非活动记录。插入后不允许删除。
  • 您是说您不想插入“新”这个词吗?你想去掉还是失败?
  • @MuhammedAli - 通过消除不是int的参数的过程。
  • @MartinSmith 欢呼朋友 :)

标签: sql sql-server sql-server-2008


【解决方案1】:

我猜你可以做这样的事情

ALTER PROCEDURE Object_Save
    @Id int = 0 OUTPUT              
    ,@OrderId int
    ,@OrderNumber varchar(20)
AS
    BEGIN TRY
        IF @Id = 0
            BEGIN
        /*Say clients been passing value "New" to @OrderNumber*/

           IF (@OrderNumber = 'New')
            BEGIN
              RAISERROR('Invalid OrderNumber Please Provide valid value', 16, 1)
              RETURN
            END

                INSERT INTO Table_Order(OrderId, OrderNumber) 
                VALUES (@OrderID, @OrderNumber)

                Set @Id = SCOPE_IDENTITY()
            END
        ELSE
            BEGIN
                -- Update
            END
    END TRY
    BEGIN CATCH
        exec error_catch
    END CATCH

【讨论】:

  • 如果您将 RAISERROR 包装在 TRY ... CATCH 中,它不会捕获您刚刚提出的异常吗?
  • 我检查了变量值,如果它是“New”而不是引发错误,这将导致代码跳转到catch块,返回关键字将停止代码的进一步执行。
  • 由于您的 RETURN 语句位于代码引发错误并且控制移至 CATCH 块的位置之后,因此我认为您的 RETURN 语句不会被执行。 (不过,如果 END CATCH 是过程的结束,效果是一样的。)
  • @AnnL。刚刚检查了一下,是的,你是对的,谢谢你非常感谢的提示,我想现在确保 proc 返回 lol 已经成为一种习惯。无论如何感谢您指出:)
  • 很多我没有使用 try catch 块的程序在那里是强制性的,但在这种情况下不是,就像我现在说的那样习惯了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
相关资源
最近更新 更多