Invoke-SqlCmd 缩短结果
Posted
技术标签:
【中文标题】Invoke-SqlCmd 缩短结果【英文标题】:Invoke-SqlCmd shortens results 【发布时间】:2021-12-21 11:32:28 【问题描述】:我正在编写一个脚本,该脚本有助于将列中的一些数据提取到文本文件中。 它将几列连接成一列。
我遇到的问题是,当我使用 powershell Invoke-SqlCmd 时,结果会缩短,并且结尾会像这样被切断
Some example text thats fine
This text is too long so it will be cu...
This is also fine
我尝试添加 -MaxCharLength 参数,但没有帮助。
只是为了确认一下,SSMS 中的结果在生成的列的全长上显示良好。
我检查了有问题的列的长度,它有 226 个字符。有什么解决办法吗?
编辑:当我做 Out-File 时也会发生同样的事情,即使有额外的 -Width,但有趣的是当我做 Export-Csv 时它不会发生
Invoke-Sqlcmd $CreateScripts -ServerInstance $serverInstace -Database $dbName | Export-Csv C:\Users\glueTorndao\Desktop\test.csv
如果有人想复制 SQL 命令如下:
SELECT
'IF EXISTS (SELECT * FROM sys.database_principals WHERE name = ''' + USR.name + ''') BEGIN '
+
CASE
WHEN DBP.state <> 'W'
THEN DBP.state_desc
ELSE 'GRANT'
END
+ SPACE(1) + DBP.permission_name + SPACE(1) + 'ON ' + QUOTENAME(USER_NAME(OBJ.schema_id)) + '.' + QUOTENAME(OBJ.name)
+ CASE
WHEN CL.column_id IS NULL
THEN SPACE(0)
ELSE '(' + QUOTENAME(CL.name) + ')'
END
+ SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(USR.name) COLLATE database_default
+ CASE WHEN DBP.state <> 'W' THEN SPACE(0) ELSE SPACE(1) + 'WITH GRANT OPTION' END + ' END ;' as '--ObjectGrants'
FROM sys.database_permissions AS DBP
INNER JOIN sys.objects AS OBJ ON DBP.major_id = OBJ.[object_id]
INNER JOIN sys.database_principals AS USR ON DBP.grantee_principal_id = USR.principal_id
LEFT JOIN sys.columns AS CL ON CL.column_id = DBP.minor_id AND CL.[object_id] = DBP.major_id
ORDER BY DBP.permission_name ASC, DBP.state_desc ASC
问题是由名称为 95 个字符的单个存储过程引起的,并且一个用户对该过程具有执行权限。
Powershell 命令现在看起来像这样:
Invoke-Sqlcmd $createScript -ServerInstance $serverInstace -Database $dbName -MaxCharLength 10000 | Format-Table | Out-File C:\Users\GlueTornado\Desktop\test5.txt -Width 10000
【问题讨论】:
您确定实际的 值 被截断了吗?大多数时候,明显的值截断实际上只是被截断的显示。 这肯定是一个展示的东西。从Invoke-SqlCmd
返回的每一列在表格中显示 时的字符数是有限的。但是,如果您将该数据存储到变量中,则完整值将存储在所述变量中。
好吧,我最初是在将 Out-File 转换为文本文件,并且其中的值也被截断,显示为“此文本太长,因此将是 cu...”但是,当我执行 Export- csv没有这个问题,所以一定是和数据的保存方式有关
【参考方案1】:
默认输出格式将只使用每个结果的一行文本,并且只会填充控制台的宽度而不会再填充(没有水平滚动),因此空间是有限的。另一方面,如果需要,列表格式的输出将把文本换成多行。
尝试将输出通过管道传输到格式列表,例如:
Invoke-SqlCmd "SELECT Description FROM MyTable" | Format-List
【讨论】:
不幸的是,这并没有帮助,但正如我上面提到的,我发现我可以执行 Export-Csv 并且不会发生同样的事情。不过很奇怪,很高兴知道发生了什么 @gluetornadoFormat-Table
用于在控制台屏幕上以表格形式格式化数据(display)。太长的行将被截断,但您可以将开关 -Wrap
添加到其中,这样长行将被换行到新行。不要将Format-Table
(或格式列表)用于任何其他用途,但要在控制台中显示。正如您所注意到的,删除它并将数据直接传送到 Export-Csv
不会截断。
格式化为列表确实解决了这个问题。也感谢您对格式的额外解释!我想我最初没有仔细阅读您的评论,不知道为什么我使用 table.. 无论如何我不确定差异如此之好,它出现了。我接受了您的回答作为解决方案,谢谢!以上是关于Invoke-SqlCmd 缩短结果的主要内容,如果未能解决你的问题,请参考以下文章
Powershell运行Invoke-Sqlcmd命令的先决条件
PowerShell 中对 Invoke-Sqlcmd 的 Unicode 支持
Invoke-sqlcmd 等待恢复完成,然后再进行下一个任务
如何使用 Invoke-Sqlcmd 连接到 SQL Server LocalDB?