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
相关产品推荐
相关产品推荐

