c# - 将空的 DateTime 值发送到 SQL 存储过程。但不为空

标签 c# sql-server-2008 datetime sqlparameter

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

@pmNext_Check_Date DATETIME=NULL

我想在 3 个场景中使用这个参数:
  • 如果为 NULL,则不更新任何记录
  • 如果它有日期值,则更新我在 WHERE 子句
  • 中指定的所有记录
  • 问题一!对于 WHERE 子句中的记录,将查询中的所有日期字段设置为 NULL。

  • 这是 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/

    相关文章:

    c# - OData $expand URL 限制?

    c# - WPF - 无法在 WebBrowser 控件中从本地计算机打开文件

    SQL:根据财务报告的最后付款日期创建账龄桶

    sql - 根据变量/查询结果选择列的优雅方法?

    date - 是否有比 UTC 更 "Date"的替代 "ambiguous"数据类型?

    c# - DbDataReader、NextResult() 和填充多个表

    c# - 全局化运行时生成的程序集

    sql - XQuery [nodes()] : Syntax error near '<eof>' , 需要一个步骤表达式

    .net - .NET 中的 new Date().getTime()

    datetime - Coldfusion Now() 返回错误的分钟数