2013-03-25 26 views
0

你好,我目前正在爲客戶轉換數據。我正在導入「|」分隔文本文件到SQL Server 2008 R2。客戶使用'01/01/0001'作爲空白日期;但是,當我導入此值時,SQL Server將此日期視爲「01/01/2001」。返回數據類型日期和值'01/01/2001'的記錄的SQL查詢?

我原來的工作是導入爲char(10),然後在導入之後進行更改。這對一些工作,但我發現,它並不總是工作!無奈....

我需要做一個搜索如果你想只更新到NULL所有實例(類型與約會的'01/01/2001'

+3

什麼「並不總是工作!!!!」意思?我知道這很令人沮喪,但如果我們不瞭解整個問題,我們也試圖幫助解決問題,這令人沮喪。 – 2013-03-25 16:41:06

+0

您是否嘗試過使用date或datetime2導入日期,該日期應該接受「01/01/01000」?您使用的是哪種字段類型? – 2013-03-25 16:42:04

+4

嗯,我不嘲諷'01/01/0001'是一個很好的策略,無論你使用什麼樣的數據類型,都是「空白日期」。我們有足夠的「魔法價值」,我們不需要創造更多。改用'NULL'。 – 2013-03-25 16:44:36

回答

2

值的所有數據,這是更好比某些魔法01/01/0001值),那麼你可以說:

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += N' 
UPDATE ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) 
    + ' SET ' + QUOTENAME(name) + ' = NULL 
     WHERE ' + QUOTENAME(name) + ' = ''20010101'';' 
FROM sys.columns 
WHERE system_type_id = 40; -- date 

PRINT @sql; 
--EXEC sp_executesql @sql; 

現在,我懷疑的情況下,並沒有工作的情況下,數據類型其實也不是date而是datetime/smalldatetime。所以,你可能反而要這樣:

WHERE system_type_id IN (40,42,43,58,61); 

如果你還是想用這個騙人把戲,你可以改變這一行:

+ ' SET ' + QUOTENAME(name) + ' = NULL 

要這樣:

+ ' SET ' + QUOTENAME(name) + ' = ''00010101'' 

但這韓元」如果該列是datetime/smalldatetime,則工作!

請注意,您應始終使用YYYYMMDDThis MM/DD/YYYY stuff is a bad habit and prone to misinterpretation up and down the stack