我正在尝试sp_AskBrent
使用 PowerShell运行Invoke-SQLCmd
并将其输出捕获到一个变量中:
$query = "EXEC SAIDBA.monitoring.sp_AskBrent @Seconds=10;"
$check = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $query
-ErrorAction Stop -ConnectionTimeout 3
使用ExpertMode = 0运行时,没问题。
但是当使用ExpertMode = 1运行时,我们注意到三件事:
- 它将每个数据输出到 shell
$check
一片空白它以以下错误结束:
Invoke-Sqlcmd:SQL PowerShell 中不允许重复的列名。要重复列,请使用格式为 Column_Name AS New_Name 的重复列的列别名。
在行:1 字符:18- $check = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $query -Er ...
- CategoryInfo: SyntaxError: (:) [调用-Sqlcmd], SqlPowerShellSqlExecutionException
- FullyQualifiedErrorId:DuplicateColumnNameErrorMessage,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
我认为有一种解决方法是提供用于sp_AskBrent
将ExpertMode数据存储到表中并随后从这些表中进行选择的参数,但我想确保没有办法在 PowerShell 中立即取回所有内容。
布伦特在这里。正确,@ExpertMode = 1 打开多个结果集 - 诊断、等待统计、文件统计和 perfmon 计数器。
如果您只想要一个结果集,请不要打开@ExpertMode。
如果您想要多个结果集,但您的应用程序(在本例中为 PoSH)无法使用它们,则需要将它们记录到表中。这就是这些参数的来源:
如果您希望它以不同的方式工作,请描述您的需求,我会看看是否可以想出办法来获得它。希望有帮助!
来自评论:
嗯不错。只需记住几件事——表格不会自行清理,
@SkipChecksQueries = 0
例如,如果您使用参数,表格会变大。许可还禁止分发,因此sp_AskBrent®
请确保您没有捆绑脚本,或将其安装在您不拥有的服务器上。否则,去吧!如果有什么我可以做的来帮助它变得更容易,请大声疾呼。所有输出表中都有一个日期字段,可帮助您维护历史表。
不要低估布伦特的回答(尽管他有时会在训练中给出一些好的答案)......
在 PowerShell 中,您可以执行返回多个数据集的查询,但您不能使用它来执行此操作
Invoke-Sqlcmd
,因为它目前不是为它构建的。您将有两种选择:使用 .NET 本机代码(例如
System.Data.SqlClient
)或使用可信赖的SMO
.SMO
如果我想包含服务器属性或其他可以SMO
访问的内容,我倾向于简单地选择。在上下文中,
sp_AskBrent
我继续并花了几分钟将输出构建到 HTML 报告中。此脚本的主要兴趣点是,要处理多个数据集,您将ExecuteWithResults
使用以下命名空间下可用的方法执行查询:Microsoft.SqlServer.Management.Smo.Server
Microsoft.SqlServer.Management.Smo.Database
database
您可以在 MSDN 此处查看使用命名空间的示例。在我的脚本中,我使用了Server
命名空间。它会以任何一种方式工作,但如果您查看 MSDN 文章,ExecuteWithResults
它将返回一个DataSet
对象,并且该对象将包含一个DataTable
. 的数量DataTables
取决于您的代码返回的数据集数量。在布伦特程序的情况下,您将返回 5DataTables
。您可以在下面的代码中通过在循环$results.Count
之前添加 in 来验证这一点。foreach
现在这个脚本中的另一个注意事项是我选择输出到 HTML。如果需要,您可以选择另一种格式,但将所有内容输出到控制台是不可读的。我还会注意到我添加了帮助信息,因此
Get-Help
如果您需要查看参数的详细信息或提醒自己如何调用它,您可以针对脚本使用。对于这个示例,我使用了Pinal Dave 的一小段代码来在我的本地实例上生成一些 CPU 使用率。(否则程序没有返回太多信息)。
脚本