【问题标题】:SQL Server: set NULL value to today's valueSQL Server:将 NULL 值设置为今天的值
【发布时间】:2010-11-30 15:21:57
【问题描述】:

我在 SQL Server 数据库中有一个列 EntryDate

如果查询中未提供值,我如何设置 NULL 值以用今天的日期(服务器时间)填充它?

【问题讨论】:

    标签: sql sql-server null


    【解决方案1】:

    不允许在列上使用 Null,并在 getdate() 列上设置默认值

    /*Deal with any existing NULLs*/
    UPDATE YourTable SET EntryDate=GETDATE() WHERE EntryDate IS NULL
    
    /*Disallow NULLs*/
    ALTER TABLE YourTable ALTER COLUMN EntryDate DATE NOT NULL
    
    /*Add default constraint*/
    ALTER TABLE YourTable ADD CONSTRAINT
        DF_YourTable_EntryDate DEFAULT GETDATE() FOR EntryDate
    

    【讨论】:

    • 这是最好的解决方案。它确实具有如果查询显式为 EntryDate 字段提供 NULL 的效果,则查询将出错。查询必须要么不为 EntryDate 指定任何内容,要么指定 DEFAULT VALUES。
    • 最好,可能,但这不是他想要的
    • @smirkingman - IMO 含糊不清。取决于您如何解释“如果查询中未提供值”。我的回答是将今天的日期添加到该列中,以便插入语句不提供 EntryDate 的值,例如 INSERT INTO [YourTable] (Col1) VALUES ('X')
    • 默认约束本身回答了这个问题。 Martin 提供了更多解决现有数据和加强数据完整性的方法。
    • 谢谢,这正是我需要的。
    【解决方案2】:
    Update table 
    set EntryDate = getdate() 
    where EntryDate is null
    

    【讨论】:

    • 如果您发布代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!
    • 另外,这并不完全是自动的,就像 OP 可能期望的那样。当然 - 它将 NULL 值更新为今天的日期 - 但这需要显式调用,它不会在插入数据时自动执行......
    【解决方案3】:

    另一种解决方案:

    重命名您的表,并创建一个具有相同名称的视图来执行您想要的逻辑,即:

    CREATE VIEW TableName
    AS
    SELECT Column1, Column2, ... ISNULL(EntryDate, GETDATE())
    FROM Old_TableName
    

    然后你不会改变你的实际数据,但如果你得到那个表的空值,它会报告今天的日期。

    【讨论】:

    • 这会导致 EntryDate 的值与其他答案的行为非常不同。这个问题很模糊,所以我不确定哪个是正确的。使用视图将导致 NULL EntryDate 列始终具有当前日期时间值(每次运行都不同),而不是 UPDATE 答案,其中 NULL EntryDate 列更改为当前日期时间一次,然后为每个未来保留相同的值选择。
    • 我认为这是正确的解决方案,除了你必须使用 COALESCE 而不是 ISNULL
    • @idevlop - 为什么?我之前在 SQL Server 视图中使用过这个逻辑
    • 那很好……只是我不知道 ISNULL 存在并且我一直使用 COALESCE。
    • 你不能一味地使用一个或另一个,它们是不同的! ISNULL()的结果总是取第一个参数的数据类型(不管是否它是 NULL 或 NOT NULL)。 COALESCE 更像是一个 CASE 表达式,它根据优先级返回单个数据类型并适应所有可能的结果。例如:DECLARE @foo VARCHAR(5);SET @foo=NULL; SELECT ISNULL(@foo, '123456789');SELECT COALESCE(@foo, '123456789') 参见此处:databases.aspfaq.com/database/coalesce-vs-isnull-sql.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2018-02-23
    • 2011-06-28
    • 1970-01-01
    相关资源
    最近更新 更多