PowerShell操作SQL Server异常:插入Table2时Event_Id全为99
问题排查与修复方案
核心问题
你的代码有两个关键错误,导致所有行的Event_Id都被设为99:
- 空值判断逻辑失效:
Import-CSV读取CSV空单元格时返回的是$null而非空字符串'',原代码里的$CSVEvent -eq ''根本匹配不到真正的空值;同时也没处理单元格是纯空白(比如多个空格)的情况。 - 未捕获SQL查询结果:当
$CSVEvent不为空时,你只执行了查询,但没把查到的Event_Id赋值给$EventID——$EventID始终是那个SELECT语句的字符串,后续插入时SQL无法解析这种无效值,最终触发异常导致逻辑异常(或是你的数据库环境将无效值默认处理成了99)。
另外,原代码直接拼接SQL字符串,存在严重的SQL注入风险,比如$CSVName里带单引号的话,会直接导致SQL语法错误。
修复后的代码
$CSVImport = Import-CSV $CSVFileName ForEach ($CSVLine in $CSVImport) { $CSVEvent = $CSVLine.Event $CSVName = $CSVLine.Name # 覆盖null、空字符串、纯空白的所有空值场景 if ([string]::IsNullOrWhiteSpace($CSVEvent)) { $EventID = 99 } else { # 参数化查询获取EventID,避免注入并正确捕获结果 $getEventQuery = "SELECT CONVERT(int, Event_Id) AS EventId FROM Table1 WHERE Event_name = @EventName" $eventResult = Invoke-Sqlcmd -Query $getEventQuery -Parameter @{ EventName = $CSVEvent } # 无匹配结果时兜底设为99(可根据需求调整逻辑) $EventID = $eventResult ? $eventResult.EventId : 99 } # 插入时用参数化查询,避免语法错误与注入风险 $insertQuery = "INSERT INTO Table2(Event_Id, Name) VALUES(@EventId, @Name);" Invoke-Sqlcmd -Query $insertQuery -Parameter @{ EventId = $EventID; Name = $CSVName } }
关键修复点说明
- 修正空值判断:用
[string]::IsNullOrWhiteSpace()替代原判断,能覆盖所有空值场景。 - 正确捕获查询结果:将
Invoke-Sqlcmd的返回值存入变量,提取真实的EventId赋值给$EventID,确保拿到的是有效ID值。 - 参数化查询:通过
-Parameter传递变量,彻底避免SQL注入,同时解决字符串转义问题(比如名称带单引号的情况)。 - 容错处理:增加查询无结果时的兜底逻辑,避免因匹配不到
Event_name导致插入失败。
内容的提问来源于stack exchange,提问作者aasenomad
相关产品推荐
相关产品推荐

