通过Windows PowerShell将CSV文件导入MySQL数据库时遭遇SQL语法错误的问题求助
解决PowerShell导入CSV到MySQL的SQL语法错误问题
我来帮你分析下问题所在,你遇到的错误主要是几个细节没处理到位,咱们一步步来修正:
1. 循环逻辑的错误
你写的 foreach($row in $data[0]) 其实是在遍历第一行数据对象的所有属性(比如Filiale、Jahr这些字段名),而不是插入这一行数据。如果只是想测试插入第一行,直接获取该行对象即可;如果要批量插入,就遍历整个$data集合。
2. SQL语句拼接的问题
在PowerShell的双引号字符串中,直接写$row.Filiale会导致解析异常,而且如果字段是字符串类型,没有加单引号会触发SQL语法错误。更关键的是,直接拼接变量不仅容易出现语法问题,还存在SQL注入风险。
正确的解决方案
方案一:临时测试用的字符串拼接(不推荐用于生产环境)
如果只是快速测试,你可以用$($row.FieldName)的语法让PowerShell正确解析变量,同时给字符串字段加上单引号:
$data = Import-Csv C:\TextExport\Akustik.csv # 获取第一行测试数据 $row = $data[0] # 注意:字符串字段加单引号,数字字段不用,根据你的表结构调整 $query = @" INSERT INTO akustik (Filiale, Jahr, Auftrag_Monat, Auftrag_Woche, LE_Jahr, LE_Monat, LE_Woche, Anzahl, Anzahl0, Umsatz) VALUES ('$($row.Filiale)', $($row.Jahr), $($row.Auftrag_Monat), $($row.Auftrag_Woche), $($row.LE_Jahr), $($row.LE_Monat), $($row.LE_Woche), $($row.Anzahl), $($row.Anzahl0), $($row.Umsatz)) "@ $stmt = New-Object System.Data.Odbc.OdbcCommand($query,$Conn) $stmt.ExecuteNonQuery()
方案二:参数化查询(推荐,安全且稳定)
使用ODBC的参数化查询可以彻底避免语法错误和SQL注入问题,代码也更健壮:
$data = Import-Csv C:\TextExport\Akustik.csv $row = $data[0] # 测试第一行数据 # 用?作为参数占位符,顺序要和字段顺序对应 $query = @" INSERT INTO akustik (Filiale, Jahr, Auftrag_Monat, Auftrag_Woche, LE_Jahr, LE_Monat, LE_Woche, Anzahl, Anzahl0, Umsatz) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "@ $stmt = New-Object System.Data.Odbc.OdbcCommand($query,$Conn) # 按顺序添加参数值 $stmt.Parameters.AddWithValue("@Filiale", $row.Filiale) $stmt.Parameters.AddWithValue("@Jahr", $row.Jahr) $stmt.Parameters.AddWithValue("@Auftrag_Monat", $row.Auftrag_Monat) $stmt.Parameters.AddWithValue("@Auftrag_Woche", $row.Auftrag_Woche) $stmt.Parameters.AddWithValue("@LE_Jahr", $row.LE_Jahr) $stmt.Parameters.AddWithValue("@LE_Monat", $row.LE_Monat) $stmt.Parameters.AddWithValue("@LE_Woche", $row.LE_Woche) $stmt.Parameters.AddWithValue("@Anzahl", $row.Anzahl) $stmt.Parameters.AddWithValue("@Anzahl0", $row.Anzahl0) $stmt.Parameters.AddWithValue("@Umsatz", $row.Umsatz) $stmt.ExecuteNonQuery()
如果需要批量插入所有行,只需要把参数化的逻辑放到foreach循环里:
$data = Import-Csv C:\TextExport\Akustik.csv $query = @" INSERT INTO akustik (Filiale, Jahr, Auftrag_Monat, Auftrag_Woche, LE_Jahr, LE_Monat, LE_Woche, Anzahl, Anzahl0, Umsatz) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "@ foreach($row in $data){ $stmt = New-Object System.Data.Odbc.OdbcCommand($query,$Conn) $stmt.Parameters.AddWithValue("@Filiale", $row.Filiale) $stmt.Parameters.AddWithValue("@Jahr", $row.Jahr) $stmt.Parameters.AddWithValue("@Auftrag_Monat", $row.Auftrag_Monat) $stmt.Parameters.AddWithValue("@Auftrag_Woche", $row.Auftrag_Woche) $stmt.Parameters.AddWithValue("@LE_Jahr", $row.LE_Jahr) $stmt.Parameters.AddWithValue("@LE_Monat", $row.LE_Monat) $stmt.Parameters.AddWithValue("@LE_Woche", $row.LE_Woche) $stmt.Parameters.AddWithValue("@Anzahl", $row.Anzahl) $stmt.Parameters.AddWithValue("@Anzahl0", $row.Anzahl0) $stmt.Parameters.AddWithValue("@Umsatz", $row.Umsatz) $stmt.ExecuteNonQuery() }
为什么之前的代码会报错?
你之前的代码里,$query定义在循环外部,此时$row还未被赋值,PowerShell解析字符串时会把$row.Filiale识别为空;再加上循环逻辑错误(遍历属性而非行),最终生成的SQL语句完全不符合语法规范,所以触发了MySQL的语法错误提示。
内容的提问来源于stack exchange,提问作者LittleStudent




