将空DateTime值发送到SQL存储过程.但不是空的

Sun*_*Sun 1 c# datetime sql-server-2008 sqlparameter

我有一个SQL存储过程,它接受一个默认值为NULL的DateTime参数

@pmNext_Check_Date DATETIME=NULL
Run Code Online (Sandbox Code Playgroud)

我想在3个场景中使用此参数:

  1. 如果它为NULL,则不更新任何记录
  2. 如果它有一个日期值,那么更新我在WHERE子句中指定的所有记录
  3. 问题一个!将我的查询中的所有日期字段设置为NULL,以用于WHERE子句中的记录.

这是SP中的代码块导致我的问题(UPDATE语句的其余部分是在SP的其他地方构建并且工作正常):

IF @pmNext_Check_Date IS NOT NULL
    IF @pmNext_Check_Date ='' --This is the bit that is causing me a problem. I just need to check for a empty date
        SET @sql = @sql + ' Next_Check_Date = NULL '
    ELSE
        SET @sql = @sql + ' Next_Check_Date = @pmNext_Check_Date '                    

SET @sql = @sql + ' WHERE ID IN (1, 2)'
Run Code Online (Sandbox Code Playgroud)

例如,如果我有以下2行:

ID NextCheckDate

1 12/12/12

2 NULL

在方案1中,我不会传递参数,因为过程将使用默认值,并且不会更新任何日期.

在方案2中,我传入一个日期值并使用日期值更新这两行

在方案3中,我想将行上的日期值更新为null.方案1和方案3之间的区别在于方案3,用户将选择将日期值设置为空.

所以,我想将一个空白日期传递给存储过程.我是用C#做的,想做类似下面的事情:

SqlParameter param = new SqlParameter("@pmNext_Check_Date", "");                            
Run Code Online (Sandbox Code Playgroud)

由于SP期望DateTime,因此失败.

所以我希望能够传递一个空白日期,以及如何在SP中检查这一点.下面的当前检查不起作用:

IF @pmNext_Check_Date =''
Run Code Online (Sandbox Code Playgroud)

提前致谢.希望这一切都有意义.我正在使用C#4.0和SQL 2008

Mar*_*ell 6

没有"空白日期"这样的东西.你可以使用一个众所周知的哨兵值(例如,某些任意古代的01年1月),但是null更好.请注意,要通过null参数传递显式,您需要:

SqlParameter param = new SqlParameter("@pmNext_Check_Date", DBNull.Value);
Run Code Online (Sandbox Code Playgroud)

如果它没有足够的粒度,请考虑添加一个单独的boolean(bit)参数(或类似参数),以阐明您希望sproc执行的操作.或者:有多个触发来做这些不同的事情.

SQL Server的一个有用的标记值是1753年1月1日(SQL Server的最小值datetime) - 这可以在没有字符串解析的情况下在TSQL中生成cast(-53690 as datetime).