我正在尝试添加一种阻止用户在将来输入日期的约束,我需要它在用户尝试时引发错误。
这是我到目前为止所做的:
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'
答案 0 :(得分:4)
如果您使用的是SQL Server,最简单的解决方案是添加CHECK CONSTRAINT
以防止任何人输入超出(SQL Server)系统日期的日期。
ALTER TABLE Sale ADD CONSTRAINT CKC_SALE_SALEDATE CHECK (SaleDate <= GetDate());
编辑1 关于OP关于向存储过程添加检查约束的注释
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)
答案 1 :(得分: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;
/
可能会对您有帮助。