2011-05-18 95 views
2

好吧,所以我收到以下錯誤,這看起來很奇怪。SQL批量插入 - 不匹配

Msg 4864,Level 16,State 1,Line 3 行129,列4(BirthDay)的批量加載數據轉換錯誤(指定代碼頁的類型不匹配或無效字符)。

我的CSV文件在以下格式進行格式化

1,阿龍,Aaberg,19700926,男

但是,如果我做到以下幾點:

INSERT INTO Test.BulkInsert (FirstName, LastName, Birthday, Gender) 
VALUES ('1' 'Test', 'Me', 19851118, 'Male') 

正常工作?是什麼賦予了?我已經嘗試了在陽光下的一切。如果我使用INT作爲生日導入的數據類型正常工作。我試圖然後CAST和或CONVERT INT,我得到一個算術溢出顯然。

我忘了給你的表格代碼:

CREATE TABLE Test.BulkInsert (ID int NOT NULL, 
        FirstName VARCHAR(40), 
        LastName VARCHAR(40), 
        BirthDay SMALLDATETIME, 
          Gender VARCHAR(6) 

) 
GO 
+1

你有4列在def表中,但5在CSV ...? – gbn 2011-05-18 18:57:12

+4

行129的樣子是什麼? (實際顯示127 - 130請) – 2011-05-18 18:58:24

回答

0

你檢查你的區域設置?我相信BCP將在嘗試導入日期時間列時使用它。

或者(看起來大多數人都是這樣做的),您可以導入到臨時表中作爲VARCHAR,然後在CONDERT語句上通過datetime列執行INSERT到您的實際表中。

+0

試圖將其轉換。它不認爲它是一個字符串,因爲如果我嘗試varchar它,它也給我一個不匹配。 – GrafixMastaMD 2011-05-18 19:48:46

+0

你可以將它作爲INT('my_dt_col = CAST(CAST(my_int_col AS VARCHAR)AS DATETIME)')導入,然後在T-SQL或格式文件中進行轉換可能會解決問題。 – 2011-05-18 20:04:45

+0

我重新看了我的代碼,我把VARCHAR設置得很少。當我仔細檢查錯誤時,我注意到了這一點。感謝讓我回到那一步。這沒有意義,我不能這樣做。再次感謝。 – GrafixMastaMD 2011-05-18 20:11:39

0

一種可能性(或者您的帖子中可能是一個錯字):您的表格有四列;您的CSV行有五個值。

另一個是你的SQL語句有一個整數值。 CSV插入可能會將其視爲字符串;實際上,這個SQL:

INSERT INTO Test.BulkInsert (FirstName, LastName, Birthday, Gender) 
VALUES ('1' 'Test', 'Me', '19851118', 'Male') 
+0

是的,我在那裏也有性別。這是一個錯字,謝謝你。我在那裏真正的代碼。抱歉。 – GrafixMastaMD 2011-05-18 19:48:20

0

CSv文件幾乎和包含錯誤數據的XLS和XLST文件一樣差。我建議打開它並查看引用的行中的數據和它們附近的行。

+0

我有,我甚至還創建了一個超級簡單的csv,但它仍然失敗。 – GrafixMastaMD 2011-05-18 19:49:46

+0

你在ID列中有空值嗎?這是必填字段。 – HLGEM 2011-05-19 17:05:29

0

我會查看你的數據,看看你在129行中傳遞的日期。我相信您所看到的問題是因爲日期超出了SMALLDATETIME值的範圍(範圍是1900年1月1日至2079年6月6日)。也許這一年有一些數字轉換(例如,9185而不是1985年)或類似的東西。這是有道理的,那麼當你首先將日期轉換爲varchar時,爲什麼你會收到消息「將varchar數據類型轉換爲smalldatetime數據類型導致超出範圍的值」。

0

聽起來像你的出生日期不匹配SMALLDATETIME要求(?)

導入它作爲一個int第一(因爲你知道的作品)。

那麼一些事情你會質疑它
1)長,其中長度 2)生日 3)生日> 20790601
(1900年1月1日到2079年6月6日是範圍限制)
4)確保每個字符都是數字0-9

然後...

希望你不必每次都經歷這個。但是,如果你願意,可以考慮在.csv創建過程中進行某種驗證。