Sql 存储过程中的数据验证

Sql 存储过程中的数据验证,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我在SQLServer2008中有一个存储过程。这个存储过程的工作非常简单——它在表中插入数据。该表中的一列是varchar类型,我对该列的数据验证有异议。它接受客户机代码传递到的任何值-这是预料之中的。我被告知不要在那一栏中插入“NEW”。客户端代码神秘地发送“NEW”作为存储过程参数,存储过程按原样插入该值。我理解这需要通过客户端代码来处理。但是,由于我负责表数据,所以我计划在存储过程发现“NEW”时抛出异常。我怎样才能做到这一点 这是我的存储过程的格式: ALTER PROCEDURE O

我在SQLServer2008中有一个存储过程。这个存储过程的工作非常简单——它在表中插入数据。该表中的一列是varchar类型,我对该列的数据验证有异议。它接受客户机代码传递到的任何值-这是预料之中的。我被告知不要在那一栏中插入“NEW”。客户端代码神秘地发送“NEW”作为存储过程参数,存储过程按原样插入该值。我理解这需要通过客户端代码来处理。但是,由于我负责表数据,所以我计划在存储过程发现“NEW”时抛出异常。我怎样才能做到这一点

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

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

我想你可以这样做

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

您是否考虑过清理无效数据并在列本身上粘贴检查约束?我考虑过约束,但我的经理不允许删除任何记录。我们有一个标记“已删除”,用于跟踪活动/非活动记录。一旦插入,就不允许删除。你是说你不想插入“NEW”这个词吗?你想去掉它还是失败?@MuhammedAli-通过消除不是
int
@MartinSmith cheers-pal:)的参数的过程,如果你在尝试中包装了一个错误。。。CATCH,它不会捕获到您刚刚引发的异常吗?我检查了变量值,如果它的“New”而不是引发的错误会导致代码跳入CATCH块,则Return关键字将停止代码的进一步执行。因为您的Return语句位于代码引发错误的点之后,并且控件移动到CATCH块,我认为你的返回声明不会被执行。(不过,如果结束捕捉是过程的结束,效果是相同的。)@AnnL。只是检查了一下,是的,你是对的,谢谢你的提示,非常感谢,我想这已经成为确保proc返回lol的习惯了。无论如何,谢谢你指出:)很多我没有使用try-catch-block的过程,这是强制性的,但不是在这种情况下,就像我说的,这更多的是习惯了。