2

我正在尝试添加一种约束,以防止用户将来输入日期,当用户尝试这样做时,我需要它来引发错误。

这是我到目前为止所拥有的:

Create Procedure CustomerBooks (@month int, @year int)
AS
BEGIN
    SELECT     
       SaleNumber, 
       month(saledate) as SaleMonth, year(saledate) as SaleYear,
       CustomerNumber, EmployeeNumber, SubTotal, GST, Total
    FROM         
       sale
    Where  
       month(saledate) = @month 
       and YEAR (saledate) = @year 
End

If salemonth > GETDATE(Month(saledate))  
   or saleyear > GETDATE(YEAR(saledate))
begin
   Raiserror ('Invalid entry, you cannot enter future dates',16,1)
end


EXEC dbo.CustomerBooks @month = '1', @year = '2012'
4

2 回答 2

5

如果您使用的是 SQL Server,最简单的解决方案是添加一个CHECK CONSTRAINT以防止任何人输入超出(SQL Server)系统日期的日期。

ALTER TABLE Sale ADD CONSTRAINT CKC_SALE_SALEDATE CHECK (SaleDate <= GetDate());

编辑 1 关于 OP 关于向存储过程添加检查约束的评论

a 的好处CHECK CONSTRAINT是如果不禁用它就无法绕过它。

总会有人插入/更新数据而不通过您设置的存储过程的情况。该约束将防止输入不正确的数据。


编辑 2 关于检查 GetDate() 时 OP 的错误

以下构造当前无法编译

   If salemonth > GETDATE(Month(saledate))  
   or saleyear > GETDATE(YEAR(saledate))

错误消息提示这里有什么错误,GetDate() 函数不带任何参数。很可能,我怀疑你打算写这样的东西

   If salemonth > MONTH(GetDate())  
   or saleyear > YEAR(GetDate())

编辑 3

通过使用以下 if/then/else 构造来验证输入是否不在未来。另一种选择是将输入转换为实际日期并进行检查。

IF (YEAR(GetDate()) < @year)    
  Raiserror ('Invalid entry, you cannot enter future dates',16,1)
ELSE IF (YEAR(GetDate()) = @year) AND (MONTH(GetDate()) < @month) 
  Raiserror ('Invalid entry, you cannot enter future dates',16,1)

SQL 小提琴示例

于 2013-04-04T05:22:05.777 回答
0

改为使用触发器。

Create or replace trigger tri_name
before insert on  sale 
begin
If salemonth > GETDATE(Month(saledate)) or saleyear > GETDATE(YEAR(saledate))
then 
Raiserror ('Invalid entry, you cannot enter future dates',16,1)
end;
/

可能这会对你有所帮助。

于 2013-04-04T05:19:55.167 回答