检查SQL Server存储过程中的无效日期

时间:2010-10-01 19:05:52

标签: sql-server datetime

我在SQL Server 2008中有一个存储过程,它将记录插入表中。

sproc看起来与此相似:

    -- params
@f1 int, 
@f2 datetime = null, 
@f3 datetime,
@f4 bit = 0 

BEGIN
    INSERT INTO dbo.table
    (fields......)
    VALUES
    (@params.....)

    RETURN @@IDENTITY
END

在运行INSERT语句之前,我想捕获f2参数的日期时间值。如果f2不是有效日期,我想将其设置为null。

我对如何执行此操作的语法很模糊。我认为以下就足够了,但不是这样:

--params
@f1..
@f2..
...

IF(ISDATE(@f2) < 1)
SET @f2= NULL

BEGIN
 INSERT...
 ...
END

在执行INSERT之前捕获和重置参数值的语法是什么?

顺便说一下,导致我找到这个问题的解决方案的原因在于我将C#最小日期值“1/1/0001”传递给SQLS,它支持最小日期值“1753年1月1日”。

2 个答案:

答案 0 :(得分:3)

由于@ f2是日期时间,因此它永远不会保持无效日期

但只是为了好玩,这就是你要检查它的方式

IF ISDATE(@f2) =0
SET @f2= NULL

但就像我说的那样永远不会是真的,如果你将1600年1月1日传递给proc,它将会爆炸并且永远不会执行

如果您使用的是SQL Server 2008,则可以使用datetime2

以下是一个示例,如果您无法更改日期时间列,仍可以使用datetime2进行检查

declare @d datetime2
select @d = '16000101'

select @d,
    convert(varchar(8),@d,112),
    isdate(convert(varchar(8),@d,112))  -- not a valid datetime

答案 1 :(得分:3)

它已经是有效的datetime,因为它已通过存储的proc参数传递。它不会是1753年之前的日期

注意:在SQL Server 2008中,您的日期和日期时间2可以追溯到0年级,但ISDATE仅适用于“旧”日期时间范围MSDN