You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过Windows PowerShell将CSV文件导入MySQL数据库时遭遇SQL语法错误的问题求助

解决PowerShell导入CSV到MySQL的SQL语法错误问题

我来帮你分析下问题所在,你遇到的错误主要是几个细节没处理到位,咱们一步步来修正:

1. 循环逻辑的错误

你写的 foreach($row in $data[0]) 其实是在遍历第一行数据对象的所有属性(比如FilialeJahr这些字段名),而不是插入这一行数据。如果只是想测试插入第一行,直接获取该行对象即可;如果要批量插入,就遍历整个$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

火山引擎 最新活动