我在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日”。
答案 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