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 并且不会发生同样的事情。不过很奇怪,很高兴知道发生了什么 @gluetornado Format-Table 用于在控制台屏幕上以表格形式格式化数据(display)。太长的行将被截断,但您可以将开关 -Wrap 添加到其中,这样长行将被换行到新行。不要将Format-Table(或格式列表)用于任何其他用途,但要在控制台中显示。正如您所注意到的,删除它并将数据直接传送到 Export-Csv 不会截断。 格式化为列表确实解决了这个问题。也感谢您对格式的额外解释!我想我最初没有仔细阅读您的评论,不知道为什么我使用 table.. 无论如何我不确定差异如此之好,它出现了。我接受了您的回答作为解决方案,谢谢!

以上是关于Invoke-SqlCmd 缩短结果的主要内容,如果未能解决你的问题,请参考以下文章

Powershell运行Invoke-Sqlcmd命令的先决条件

PowerShell 中对 Invoke-Sqlcmd 的 Unicode 支持

Invoke-sqlcmd 等待恢复完成,然后再进行下一个任务

如何使用 Invoke-Sqlcmd 连接到 SQL Server LocalDB?

确保所有invoke-sqlcmd 命令都发生在同一个事务中?

PowerShell-将CSV导入SQL Server