Sun*_*Sun 1 c# datetime sql-server-2008 sqlparameter
我有一个SQL存储过程,它接受一个默认值为NULL的DateTime参数
@pmNext_Check_Date DATETIME=NULL
Run Code Online (Sandbox Code Playgroud)
我想在3个场景中使用此参数:
这是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
没有"空白日期"这样的东西.你可以使用一个众所周知的哨兵值(例如,某些任意古代的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).