【问题标题】:How to verify whether the SQL server instance is correct or not using powershell?如何使用powershell验证SQL服务器实例是否正确?
【发布时间】:2012-07-17 10:24:37
【问题描述】:

我们正在使用 Invoke-sqlcmd cmdlet 使用 powershell 执行 SQL 查询。

如果 SQl 服务器实例错误,则抛出异常。

虽然我已经在 try catch 中捕获了错误,但它仍然在控制台中抛出异常

"Invoke-Sqlcmd : 发生与网络相关或特定于实例的错误 在建立与 SQL Server 的连接时"

            try {
            $Qresult= Invoke-sqlcmd -query $SelectQuery -ServerInstance $srvInstance
            $Qresult = $Qresult| % { $_.$columnName+"`n" }
            LogWrite "$Qresult`n"
        }
        catch {
            Write-error "Error occured when executing sql $SelectQuery"
            LogWrite $Error[0]
        }

在执行任何查询之前,如何验证 SQL Server 实例是否可用以及是否正在运行?

【问题讨论】:

    标签: sql-server powershell powershell-2.0


    【解决方案1】:

    使用 powershell tr​​y/catch 块来捕获任何错误 - $_ 将包含完整的错误描述

    cls
    try
    {
    invoke-sqlcmd stuff here
    }
    catch
    {
    $_
    }
    

    您也可以 ping 服务器,但尝试执行命令将同时测试服务器、测试实例和测试运行查询的数据库,并且您的 try/catch 块将在每个阶段。

    【讨论】:

    • 我已经进一步更新了我的问题。我已经在使用 try catch
    【解决方案2】:

    使用 try/catch 无法捕获非终止错误。为了使错误成为终止错误,请将 ErrorAction 值设置为“停止”。如果没有帮助,请尝试添加 -AbortOnError 开关

    try
    {
       Invoke-sqlcmd -query... -ErrorAction Stop
    }
    catch
    {
       $_
    }
    

    【讨论】:

      【解决方案3】:
      function SQL-Ping-Instance 
      {
          param (
              [parameter(Mandatory = $true)][string] $ServerInstance,
              [parameter(Mandatory = $false)][int] $TimeOut = 1
          )
      
          $PingResult = $false
      
          try
          {
              $SqlCatalog = "master"
              $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
              $SqlConnection.ConnectionString = "Server = $ServerInstance; Database = $SqlCatalog; Integrated Security = True; Connection Timeout=$TimeOut"
              $SqlConnection.Open() 
              $PingResult = $SqlConnection.State -eq "Open"
          }
      
          catch
          {
          }
      
          finally
          {
              $SqlConnection.Close()
          }
      
          return $pingResult
      }
      
      if (SQL-Ping-Instance $srvInstance)
      {
          $Qresult= Invoke-sqlcmd -query $SelectQuery -ServerInstance $srvInstance
          $Qresult = $Qresult| % { $_.$columnName+"`n" }
          LogWrite "$Qresult`n"
      }
      else
      {
          LogWrite "Couldn't contact $srvInstance"
      }
      

      【讨论】:

      • 在这个参数中“[parameter(Mandatory = $false)[int] $TimeOut = 1”你错过了把“]”放在[int]之前。请单独更新。
      猜你喜欢
      • 2017-11-28
      • 2010-11-25
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多