PowerShell调用Invoke-SqlCmd查询结果被截断,MaxCharLength参数无效如何解决?
问题根因
你遇到的截断问题核心出在Format-Table命令上:
Format-Table属于PowerShell的格式化展示类命令,设计目标是给控制台输出易读的内容,默认会对超过展示宽度的字符串自动截断、末尾添加省略号。哪怕你后续给Out-File加了-Width参数,此时Format-Table输出的内容本身已经被截断,后续步骤无法恢复被截断的内容。Export-Csv没有问题是因为它直接读取原始对象的属性值,不会经过格式化截断逻辑。
可行解决方法
方法1(最推荐,无多余冗余内容)
不要用任何Format-*类命令做导出中间步骤,直接提取你需要的列的原始值导出即可,修改后的命令如下:
Invoke-Sqlcmd $createScript -ServerInstance $serverInstace -Database $dbName -MaxCharLength 10000 | Select-Object -ExpandProperty '--ObjectGrants' | Out-File C:\Users\GlueTornado\Desktop\test5.txt -Encoding UTF8
这个方法输出的文本就是你SQL拼接的原始内容,没有多余的表头、空格等冗余信息。
方法2(保留表格格式输出)
如果你确实需要保留表格样式的输出,需要在Format-Table步骤就添加-Wrap参数禁止截断,同时配合-Width参数,修改后的命令如下:
Invoke-Sqlcmd $createScript -ServerInstance $serverInstace -Database $dbName -MaxCharLength 10000 | Format-Table -AutoSize -Wrap | Out-File C:\Users\GlueTornado\Desktop\test5.txt -Width 10000 -Encoding UTF8
额外注意事项
- 你设置的
-MaxCharLength 10000参数是正确的,它保证了Invoke-SqlCmd从SQL Server查询时不会提前截断长字符串,默认值为4000,符合你的场景需求。 - 建议给
Out-File指定编码参数,避免输出的文本出现乱码,常用编码可选UTF8、Default(系统默认编码)。
内容的提问来源于stack exchange,提问作者gluetornado
相关产品推荐
相关产品推荐

