2013-10-28 50 views
0

我想插入null與我的查詢到允許爲空的datetime列。我的查詢工作正常(我認爲)。但是它將1900-01-01 00:00:00.000而不是null放入datetime列。爲什麼會發生這種情況,我該如何解決?無法在sql服務器中插入datetime到datetime

我創建了我自己的表來測試這個,nulling在那裏不是問題。但是,這是另一個數據庫中的問題。我認爲它必須與其他數據庫有關。

+0

我看這裏 - http://forums.asp.net/t/1687805.aspx但似乎沒有明確的答案。 – Steam

+6

您可以向我們展示您用於將數據放入日期時間列的代碼嗎?表的模式也會有幫助。 –

+0

告訴我們您的查詢請求 –

回答

1

要查看所有觸發器在數據庫中,使用以下查詢:

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 
+0

消息208,級別16,狀態1,行1 無效的對象名稱「sys.triggers」。 消息208,級別16,狀態1,行1 無效的對象名稱'sys.sql_modules'。 消息208,級別16,狀態1,行1 無效的對象名稱'sys.tables'。 – Steam

+1

這些都是標準的SQL Server對象目錄視圖(有關更多詳細信息,請參閱MSDN中的[本文]](http://technet.microsoft.com/zh-cn/library/ms189783(v = sql.105).aspx) 。如果你看不到它們,你可能不得不問問你的DBA爲什麼不。 –

+0

Muhammad ali的答案有效 - 選擇Name,OBJECT_NAME(parent_obj)FROM sysobjects where xtype ='TR' – Steam

1

如果你的插入語句是O.K.,那麼唯一的原因是觸發器會改變插入的值。 (提供您的SQL Server上沒有錯誤:-))

因此,檢查您插入的表是否具有觸發器以及它們的功能。

要查看觸發器列表,請從數據庫中的sys.triggers中選擇,或者在對象資源管理器中的SQL Server Management Studio中轉到表中,然後展開它/觸發器 - 然後您可以檢查每個觸發器。你需要檢查INSTEAD OF觸發器。但是,如果INSTEAD OF觸發器不會導致這種情況,您也可以查看AFTER觸發器。

另一種選擇是insert語句有一個bug,列默認爲1900.在這種情況下,你確定插入到你想要的列嗎?你使用INSERT表(列的列表)值和列的順序和值的順序是否正確?

+0

我使用正確的列列表插入正確的表格。我如何檢查觸發器,特別是可能導致此問題的觸發器? – Steam

+0

更新了答案。請注意,觸發器中的INSERTED是一個特殊的表格,它具有將被插入到表格中的行。 –

+1

select Name,OBJECT_NAME(parent_obj)FROM sysobjects其中xtype ='TR'查詢來檢查表上是否有觸發器:) –

2

使用INSERT查詢插入時,不要指定列名稱,也不要給出任何值。這應該在該字段中插入null。

例如,如果Entry_Dateabc表我可空datetime列,那麼我的INSERT語句是這樣的:

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

如果不提列,它應該有它的空。希望能幫助到你。