AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 122262
Accepted
Jefferson B. Elias
Jefferson B. Elias
Asked: 2015-11-28 01:46:24 +0800 CST2015-11-28 01:46:24 +0800 CST 2015-11-28 01:46:24 +0800 CST

在 PowerShell 中使用 @ExpertMode = 1 运行 sp_AskBrent

  • 772

我正在尝试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运行时,我们注意到三件事:

  1. 它将每个数据输出到 shell
  2. $check一片空白
  3. 它以以下错误结束:

    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 中立即取回所有内容。

sql-server powershell
  • 2 2 个回答
  • 1180 Views

2 个回答

  • Voted
  1. Brent Ozar
    2015-11-28T08:48:29+08:002015-11-28T08:48:29+08:00

    布伦特在这里。正确,@ExpertMode = 1 打开多个结果集 - 诊断、等待统计、文件统计和 perfmon 计数器。

    如果您只想要一个结果集,请不要打开@ExpertMode。

    如果您想要多个结果集,但您的应用程序(在本例中为 PoSH)无法使用它们,则需要将它们记录到表中。这就是这些参数的来源:

    • @OutputDatabaseName - 您要写入的数据库的名称。必须已经存在。
    • @OutputSchemaName - 您的表所在的架构,如 dbo。必须已经存在。
    • @OutputTableName - 顶级结果集(诊断)的表名。这个参数也需要上面两个。如果该表尚不存在,则会创建它。
    • @OutputTableNameFileStats、@OutputTableNamePerfmonStats、@OutputTableNameWaitStats - 其余的结果集将写在这里。如果每个表尚不存在,则将创建它。这些中的每一个都是完全可选的——您可以不传入、部分或全部传入。

    如果您希望它以不同的方式工作,请描述您的需求,我会看看是否可以想出办法来获得它。希望有帮助!

    来自评论:

    我实际上是在考虑编写一个运行状况检查脚本,我会在发生事件或进行监控时运行它,它会解析sp_AskBrent.

    嗯不错。只需记住几件事——表格不会自行清理,@SkipChecksQueries = 0例如,如果您使用参数,表格会变大。许可还禁止分发,因此sp_AskBrent®请确保您没有捆绑脚本,或将其安装在您不拥有的服务器上。否则,去吧!如果有什么我可以做的来帮助它变得更容易,请大声疾呼。

    所有输出表中都有一个日期字段,可帮助您维护历史表。

    • 10
  2. Best Answer
    user507
    2015-11-29T22:12:07+08:002015-11-29T22:12:07+08:00

    不要低估布伦特的回答(尽管他有时会在训练中给出一些好的答案)......

    在 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取决于您的代码返回的数据集数量。在布伦特程序的情况下,您将返回 5 DataTables。您可以在下面的代码中通过在循环$results.Count之前添加 in 来验证这一点。foreach

    现在这个脚本中的另一个注意事项是我选择输出到 HTML。如果需要,您可以选择另一种格式,但将所有内容输出到控制台是不可读的。我还会注意到我添加了帮助信息,因此Get-Help如果您需要查看参数的详细信息或提醒自己如何调用它,您可以针对脚本使用。

    对于这个示例,我使用了Pinal Dave 的一小段代码来在我的本地实例上生成一些 CPU 使用率。(否则程序没有返回太多信息)。

    在此处输入图像描述

    在此处输入图像描述

    脚本

    <#
        .SYNOPSIS
            Executes sp_AskBrent and outputs to HTML
        .DESCRIPTION
            Execute sp_AskBrent in normal or expert mode and outputs to an HTML.
        .PARAMETER server
            String. [REQUIRED] The SQL Server instance you wish to get results on.
        .PARAMETER timelimit
            Integer. Time used for @seconds parameter of sp_AskBrent
        .PARAMETER expertMode
            Switch. Just opts to have @ExpertMode = 1 for the query
        .PARAMETER sqlversion
            Integer. If on machine with multiple SQL Server tool versions installed, specify version.
        .PARAMETER outfile
            String. Set output file to generate HTML
        .EXAMPLE
        Run command in normal mode, which returns one dataset
        .\Script.ps1 -server MANATARMS\SQL12 -timelimit 5 -sqlversion 11 -outfile 'C:\temp\MyServer.html'
        .EXAMPLE
        Run command in expert mode, which returns multiple datasets
        .\Script.ps1 -server MANATARMS\SQL12 -timelimit 5 -expertMode -sqlversion 11 -outfile 'C:\temp\MyServer.html'
        .NOTES
        Does not check if sp_AskBrent is on the server before executing the query.
    #>
    [cmdletbinding()]
    param(
        [Parameter(Mandatory=$true,Position=0)]
        [Alias("instance")]
        [string]
        $server,
    
        [Parameter(Mandatory=$false,Position=1)]
        [int]
        $timelimit = 10,
    
        [Parameter(Mandatory=$false,Position=2)]
        [switch]
        $expertMode,
    
        [Parameter(Mandatory=$false,Position=3)]
        [int]
        $sqlversion = 11,
    
        [Parameter(Mandatory=$false,Position=4)]
        [string]
        $outfile= 'C:\temp\Testing.html'
    )
    
    $HtmlTop = @"
    <!DOCTYPE html>
    <html>
    <head>
    <style>
        body { 
            background-color:white;
            font-family:Tahoma,Arial;
            font-size:10pt;
        }
        table {
            border-collapse: collapse;
        }
        th { 
            border:2px solid black;
            color:white;
            background-color: #0066FF;
            padding: 4px;
        }
            th.subhead {
                color:black;
                background-color: #8dbafc
            }
        td {
            border: 1px solid black;
            padding: 2px;
        }
    
    </style>
    </head>
    <body>
    <h2>Server Name: $($server)</h2>
    <h3>Run Date: $(Get-Date)</h3>
    "@
    
    $HtmlTop | Out-File -FilePath $outfile -Force
    
    if ($expertMode) {
        $askBrent = "EXEC sp_AskBrent @Seconds=$($timelimit), @ExpertMode=1"
    }
    else {
        $askBrent = "EXEC sp_AskBrent @Seconds=$($timelimit), @ExpertMode=0"
    }
    
    try { 
        Add-Type -AssemblyName "Microsoft.SqlServer.Smo,Version=$($sqlversion).0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91"
    }
    catch {
        Add-Type -AssemblyName "Microsoft.SqlServer.Smo"
    }
    
    $srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $server
    
    $results = $srv.ConnectionContext.ExecuteWithResults($askBrent);
    
    foreach ($t in $results.Tables) {
        $t | Select-Object * -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray | ConvertTo-Html -As Table -Fragment | Out-String | Out-File -FilePath $outfile -Append
        ## This is just to get a break between tables ##
        "<hr>" | Out-File -FilePath $outfile -Append
    }
    
    • 7

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve