Invoke-Sqlcmd -OutputAs DataTables单多记录返回类型差异问题
问题原因
这是PowerShell 5.1环境下Invoke-Sqlcmd的典型设计缺陷:当指定-OutputAs DataTables参数时,cmdlet会对单元素结果做自动展开处理——查询返回1条记录时直接输出DataRow类型对象,仅当返回记录数≥2时才输出DataTable类型对象,和参数声明的预期返回类型不一致。
这种类型不一致直接导致后续调用.where()方法时报错:DataRow类型本身没有定义该集合方法,只有DataTable这类集合对象支持直接调用.where()做过滤。
修复方法
- 方法1:强制统一返回类型为DataTable
调用命令时用数组运算符包裹结果,固定取第一个表对象,从根源上消除类型差异:
处理后无论查询返回0行、1行还是多行,$tblOutput = @(Invoke-Sqlcmd ... -OutputAs DataTables)[0]$tblOutput始终是DataTable类型,原有过滤代码$tblOutput.where({ $_.Flags -eq 36 -And $_.Result -eq 1 })可以正常执行。 - 方法2:改用PowerShell原生过滤语法
不依赖集合的.where()方法,用管道的Where-Object做过滤,PowerShell会自动适配单对象和集合对象的遍历逻辑:
这种写法不需要修改原有$successResults = $tblOutput | Where-Object { $_.Flags -eq 36 -And $_.Result -eq 1 }Invoke-Sqlcmd的调用逻辑,兼容两种返回类型。 - 方法3:升级SqlServer模块版本
新版SqlServer模块已经修复了这个返回类型不一致的bug,指定-OutputAs DataTables时会固定返回DataTable类型,不会出现单记录自动展开的问题。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

