錯誤 SQL
string sql = "insert into Phone3 (select * from Phone1 union select * from Phone2)";
問題
- 多餘括號:SQL Server
INSERT ... SELECT **不需要**將 SELECT 用括號包裹。
- 欄位順序/數量不匹配:
* 依賴表定義順序,三表結構必須**完全一致**(欄位數、型別、順序),否則報錯或資料錯位。
- 未捕獲 SqlException:
ExecuteNonQuery() 拋出例外,未 try-catch 導致執行緒退出代碼 259 (0x103 = 尚未處理的例外)。
修正代碼
string sql = "INSERT INTO Phone3 (Col1, Col2, Col3) " + // 明確列出目標欄位
"SELECT Col1, Col2, Col3 FROM Phone1 " +
"UNION " + -- UNION ALL 保留重複,UNION 去重
"SELECT Col1, Col2, Col3 FROM Phone2";
using (SqlConnection con = new SqlConnection(strConn))
using (SqlCommand cmd = new SqlCommand(sql, con)) {
try {
con.Open();
int rows = cmd.ExecuteNonQuery();
MessageBox.Show(rows > 0 ? $"成功插入 {rows} 筆" : "無資料插入");
} catch (SqlException ex) {
MessageBox.Show("SQL 錯誤: " + ex.Message);
}
}
最佳實踐
- **永遠明確列出欄位**,避免
* 導致結構變更時靜默錯誤。
using 確保連線/命令釋放。
try-catch SqlException 給使用者友善提示並記錄日誌。