我有一个 SQL 存储过程,它接受一个默认值为 NULL 的 DateTime 参数
@pmNext_Check_Date DATETIME=NULL
我想在 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)'
因此,例如,如果我有以下 2 行:
ID NextCheckDate
1 2012 年 12 月 12 日
2 空
在场景 1 中,我不会传递参数,因为该过程将使用默认值并且不会更新任何日期。
在方案 2 中,我传入一个日期值并使用日期值更新两行
在场景 3 中,我想将行上的日期值更新为空。场景 1 和 3 之间的区别在于,在场景 3 中,用户将选择将日期值设置为空。
所以,我想将一个空白日期传递给存储过程。我正在从 C# 执行此操作,并想做如下操作:
SqlParameter param = new SqlParameter("@pmNext_Check_Date", "");
这失败了,因为 SP 需要一个 DateTime。
所以我希望能够传递一个空白日期,以及如何在 SP 中检查它。下面的当前检查不起作用:
IF @pmNext_Check_Date =''
提前致谢。
希望这一切都有意义。
我正在使用 C#4.0 和 SQL 2008
最佳答案
没有所谓的“空白日期”。您可以使用一个众所周知的标记值(例如,某个任意古代年份的 1 月 1 日),但是 null
会更好。请注意,要传递显式 null
通过参数,您需要:
SqlParameter param = new SqlParameter("@pmNext_Check_Date", DBNull.Value);
如果这没有足够的粒度,请考虑添加一个单独的 bool (
bit
) 参数(或类似参数),以阐明您希望存储过程执行的操作。或者:有多个 proc 来做这些不同的事情。SQL Server 的一个有用的标记值是 1753 年 1 月 1 日(SQL Server 的最小值
datetime
值) - 这可以在 TSQL 中生成,而无需将字符串解析为 cast(-53690 as datetime)
.
关于c# - 将空的 DateTime 值发送到 SQL 存储过程。但不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14458133/