【问题标题】:Cannot insert null into datetime in sql server无法在sql server中将null插入日期时间
【发布时间】:2013-10-28 17:57:53
【问题描述】:

我正在尝试将 null 与我的查询一起插入到允许 null 的日期时间列中。我的查询工作正常(我认为)。但是它将 1900-01-01 00:00:00.000 而不是 null 放入日期时间列。为什么会发生这种情况,我该如何解决?

我创建了自己的表来测试这一点,并且归零不是问题。但是,这是另一个数据库中的问题。我想这一定是和其他数据库有关。

【问题讨论】:

  • 我看过这里 - forums.asp.net/t/1687805.aspx 但似乎没有明确的答案。
  • 您能告诉我们您用来将数据放入日期时间列的代码吗?表的架构也会有所帮助。
  • 请告诉我们您的查询
  • 检查表上是否没有定义默认值/

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

使用 INSERT 查询插入时,不要指定列名,也不要给出任何值。那应该在字段中插入 null。

例如,如果Entry_Date 是我在abc 表中的可为空的日期时间列,那么我的插入语句将是:

Insert into abc (Entry_Id, Entry_Value) values (1,1000);

通过不提及该列,它应该包含 null。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    要查看数据库中的所有触发器,请使用以下查询:

    select 
        t.name as [TableName], 
        tr.name as [TriggerName], 
        m.[definition]
    from sys.triggers tr
    join sys.sql_modules m on m.object_id = tr.object_id
    join sys.tables t on t.object_id = tr.parent_id
    

    要查看所有默认约束,请使用以下查询:

    select 
        t.name as [TableName],  
        c.name as [ColumnName], 
        dc.[name] as [ConstraintName], 
        dc.[definition] 
    from sys.tables t
    join sys.columns c on c.object_id = t.object_id
    join sys.objects do on do.object_id = c.default_object_id
    join sys.default_constraints dc on dc.object_id= do.object_id
    

    【讨论】:

    • Msg 208,级别 16,状态 1,行 1 无效的对象名称“sys.triggers”。消息 208,级别 16,状态 1,第 1 行无效的对象名称“sys.sql_modules”。消息 208,级别 16,状态 1,第 1 行无效的对象名称“sys.tables”。
    • 这些都是标准的 SQL Server 对象目录视图(有关详细信息,请参阅 MSDN 中的 this article)。如果您看不到它们,您可能不得不询问您的 DBA 为什么不看。
    • Muhammad ali 的回答有效 - select Name, OBJECT_NAME(parent_obj) FROM sysobjects where xtype = 'TR'
    • 是的,sysobjects 是向后兼容视图之一;请注意,根据 Microsoft 的说法,“此功能将在 Microsoft SQL Server 的未来版本中删除。”
    【解决方案3】:

    如果您的插入语句正常,那么唯一的原因是触发器会改变插入的值。 (前提是您的 SQL Server 上没有错误。:-))

    因此,请检查您要插入的表是否有触发器以及它们的作用。

    要查看触发器列表,请从数据库中的 sys.triggers 中选择表在哪里,或者在对象资源管理器中的 SQL Server Management Studio 中选择表,然后展开它/触发器 - 然后您可以检查每个触发器。您需要检查 INSTEAD OF 触发器。但是,如果 INSTEAD OF 触发器不会导致这种情况,您也可以查看 AFTER 触发器。

    另一个选项是插入语句有错误,列默认为 1900。在这种情况下,您确定要插入到您想要的列中吗?您是否使用 INSERT Table(List of columns) 值和列的顺序和值的顺序是否正确?

    【讨论】:

    • 我正在插入正确的表格,并带有正确的列列表。如何检查触发器,特别是可能导致此问题的触发器?
    • 更新了答案。请注意,触发器中的 INSERTED 是一个特殊的表,其中包含将插入到表中的行。
    • select Name, OBJECT_NAME(parent_obj) FROM sysobjects where xtype = 'TR' 查询表上是否有触发器 :)
    • @MuhammedAli - 这有帮助。我看到了触发器。
    猜你喜欢
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多