Invoke-SQLCMD 无法在 PowerShell 中运行多个 SQL 语句

Rav*_*obo 3 sql-server powershell

我无法从 Invoke-sqlcmd 运行 2 个 SELECT 语句。

$sql ="
select SERVERPROPERTY('ProductVersion') Version
select SERVERPROPERTY('ProductLevel') ServicePack, SERVERPROPERTY('edition') Edition"
    
$server = 'SomeServerName'    
Invoke-Sqlcmd -ServerInstance $server -Query $sql 
Run Code Online (Sandbox Code Playgroud)

只有第一个 TSQL 语句返回结果。

注意:我可以重写 TSQL 来生成一条语句。这不是重点。原始脚本有多个 TSQL 命令。另外,我可以为每个语句执行单独的 invoke-sqlcmd 调用。但是,我试图了解这是否是 invoke-sqlcmd 的限制。

这是预期的行为吗?

太感谢了。

mcl*_*ton 7

您已经得到了一个有效的答案,但这更多的是对正在发生的事情的解释......

基本上,您遇到的是显示/格式问题,而不是 Invoke-SqlCommand 问题。

在您的示例中,您的屏幕输出可能如下所示:

PS> Invoke-Sqlcmd -ServerInstance $server -Query $sql

Version
-------
15.0.2070.41



PS> _
Run Code Online (Sandbox Code Playgroud)

请注意表格后面的3 个空行 - 第一个空行实际上是第二个 sql 命令的结果!

当 PowerShell 格式化项目表时,它使用第一个项目来决定显示哪些列 - 第一个命令的结果仅包含一个“版本”列,因此这就是表包含的所有内容。第二个命令的结果没有“版本”列,因此 PowerShell 在该列中显示空值,但它也不会为您在表中添加“ServicePack”或“版本”列。

您可以通过指定列名来覆盖它,如下所示:

PS> Invoke-Sqlcmd -ServerInstance $server -Query $sql | format-table Version, ServicePack, Edition

Version      ServicePack Edition
-------      ----------- -------
15.0.2070.41
             RTM         Developer Edition (64-bit)


PS> _
Run Code Online (Sandbox Code Playgroud)

请注意,现在表格后面只有2 个空行,因为第二个结果已取消隐藏。

如果您在循环内分别输出两个结果,PowerShell 将显示两个单独的表,并决定分别在每个表中显示哪些列,因此根据 @Dan Guzman 的回答,您会得到以下结果:

Version    
-------    
15.0.4023.6



ServicePack Edition                   
----------- -------                   
RTM         Developer Edition (64-bit)
Run Code Online (Sandbox Code Playgroud)