首页 > 解决方案 > Invoke-SQLCMD 无法在 PowerShell 中运行多个 SQL 语句

问题描述

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

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

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

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

这是预期的行为吗?

非常感谢。

标签: sql-serverpowershell

解决方案


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

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

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

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

Version
-------
15.0.2070.41



PS> _

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

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

您可以通过使用以下内容指定列名来覆盖它:

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> _

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

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

Version    
-------    
15.0.4023.6



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

推荐阅读