在 SSMS 中直接執行 BULK INSERT Book FROM 'e:\2.txt' ... 成功,但在 MyEclipse (Java/JDBC) 中執行相同 SQL 拋出錯誤:
無法開啟檔案 "e:\2.txt",作業系統錯誤碼 123 (檔名、目錄名或磁碟區標籤語法不正確)
Java 字串字面值中 \ 為跳脫字元。'e:\2.txt' 中的 \2 被解析為八進位跳脫序列(或無效跳脫),導致實際傳送給 SQL Server 的路徑字串錯誤。
String sql = "BULK INSERT Book FROM 'e:\\\\2.txt' WITH (FIELDTERMINATOR = ' ', ROWTERMINATOR = '\\n')";
原理:Java 編譯器將 \\\\ 解析為單一反斜線字元,SQL Server 接收到正確的 e:\2.txt。
String sql = "BULK INSERT Book FROM 'e:/2.txt' WITH (FIELDTERMINATOR = ' ', ROWTERMINATOR = '\\n')";
優點:Windows/Linux 皆可識別,避免跳脫問題。SQL Server 2008+ 完整支援正斜線路徑。
String sql = "BULK INSERT Book FROM ? WITH (FIELDTERMINATOR = ' ', ROWTERMINATOR = '\\n')";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "e:/2.txt"); // 或 "e:\\2.txt"
pstmt.executeUpdate();
}
優勢:完全避免字串拼接錯誤、防止 SQL 注入、程式碼可讀性佳。
'\\\\Server\\Share\\2.txt' 替代本機磁碟機代號ROWTERMINATOR 設定:Windows 換行用 \\n 或 \\r\\n,需與檔案實際格式一致public void bulkInsertData(Connection conn, String filePath) throws SQLException {
// 統一使用正斜線
String normalizedPath = filePath.replace("\\", "/");
String sql = "BULK INSERT Book FROM ? WITH (FIELDTERMINATOR = ' ', ROWTERMINATOR = '\\n')";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, normalizedPath);
int rows = pstmt.executeUpdate();
System.out.println("匯入完成,影響列數: " + rows);
}
}
Java 中執行 BULK INSERT 路徑錯誤的核心在於字串跳脫處理。建議採用正斜線路徑搭配 PreparedStatement,同時確保 SQL Server 服務帳號具備檔案存取權限,即可徹底解決跨環境執行差異問題。