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