You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell读取Excel数据插入SQL Server数据库运行报错求助

问题原因
  • PowerShell 双引号字符串内直接调用嵌套对象属性/方法时,不会自动计算完整的属性值,只会返回对象的类型名称 System.__ComObject,所以你拼接出来的 SQL 语句里不是实际的单元格值,而是类型名,直接触发 SQL 语法报错
  • 手机号是带+的字符串类型,插入 SQL 时需要用单引号包裹,你现有代码未加引号,会被 SQL 识别为数值表达式导致内容错误
  • 循环从$i=1开始会把 Excel 表头行也插入数据库,固定循环20行的逻辑如果实际数据行数不足也会触发异常
  • GO是 SQL Server 管理工具的批处理分隔符,不属于 T-SQL 语法,Invoke-Sqlcmd 执行单条插入语句不需要加 GO
修复后的完整代码
# 加载Excel文件
$xl = New-Object -COM "Excel.Application"
$xl.Visible = $false # 后台运行无需显示界面
$wb = $xl.Workbooks.Open("C:\Users\Documents\111.xlsx")
$ws = $wb.Sheets.Item(1)
# 获取表格实际使用的最大行数,避免固定循环的问题
$rowCount = $ws.UsedRange.Rows.Count

# 循环从第2行开始,跳过表头行
for ($i = 2; $i -le $rowCount; $i++) {
    # 提前提取所有单元格值存到变量,避免字符串拼接时解析错误
    $phone = $ws.Cells.Item($i, 1).Value.ToString()
    $date = $ws.Cells.Item($i, 2).Value.ToString()
    $vaccine = $ws.Cells.Item($i, 3).Value.ToString()
    $time = $ws.Cells.Item($i, 4).Value.ToString()
    $place = $ws.Cells.Item($i, 5).Value.ToString()

    # 拼接SQL,注意MessageTo字段也用单引号包裹字符串,内容里的单引号要转义为两个单引号
    $insertquery = "
INSERT INTO dbo.MessageOut(MessageTo,MessageText)
VALUES ('$phone','您预约的疫苗接种提醒如下:
接种日期:$date
疫苗种类:$vaccine
接种时间:$time
接种地点:$place
请随身携带护照')
"
    # 执行SQL插入
    Invoke-SQLcmd -ServerInstance 'SMS\SQLEXPRESS,49366' -query $insertquery -Database SMSserver
}

# 释放Excel COM对象,避免Excel进程残留占用文件
$wb.Close()
$xl.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl) | Out-Null
Remove-Variable xl,wb,ws
额外注意点
  • 实际执行前可以先添加Write-Host $insertquery打印拼接好的SQL语句,确认语法无误后再运行插入操作
  • 如果数据量较大,建议改用参数化查询,既可以规避SQL注入风险,也能自动处理特殊字符的转义问题

内容的提问来源于stack exchange,提问作者Kirillov Alexey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:15:04