2016-10-03 1 views
-2

Ich verwende PowerShell-Skripts. Ich habe einige SeniorVerbinden mit SQL Server-Datenbank von PowerShell beim Aufrufen der Funktion von Funktion

  1. Filter $server und $instance Name aus. TXT-Datei.
  2. Verwenden Sie die $server und $instance in die 2-Funktion für Verbindung mit SQL Server

Meine .txt-Datei Code sind wie unten

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null 

# Get our list of target servers from the local servers.txt file(Need 
$servers = Get-Content 'mirroringserver.txt' 

foreach ($prcs in $servers) { 
    # The first entry in the file is the machine name, the second is the instance name so separate them 
    #$srvc = $prcs.Split($prcs, "\r\n") 
    # $ServerName = $prcs 
    $srvc = $prcs.Split('\') 

    $servers = $srvc[0] 
    $instance = $srvc[1] 
    GetConnectionString $servers $instance 
    # Ping the machine to see if it's on the network 
    $results = gwmi -query "select StatusCode from Win32_PingStatus where Address = '$servers'" 

    $responds = $false 
    foreach ($result in $results) { 
     # If the machine responds break out of the result loop and indicate success 
     if ($result.StatusCode -eq 0) { 
      $responds = $true 
      break 
     } 
    } 

    if ($responds) { 
     # Check to see if a directory exists for this machine, if not create one 
     if (!(Test-Path -Path .\$servers)) { 
      New-Item .\$servers\ -Type Directory 
     } 

     # Get the server info in the first function and the instance info in the second 

     #mirroring $servers $instance 
     getInsertServerStatus $servers $instance 
    } else { 
     # Let the user know we couldn't connect to the server 
     Write-Output "$servers does not respond" 
    } 
} 

function GetConnectionString([string]$svr, [string]$inst) { 
    return "Server=$svr\$inst;Database=master;Integrated Security=True;" 
} 

Diese meine Funktion ist 1:

function mirroring(
    $svr, 
    $inst, 
    [string] $datastore, 
    [string] $datastore1, 
    [string] $datastore2, 
    [string] $datastore3, 
    [string] $datastore4, 
    [string] $datastore5, 
    [string] $datastore6, 
    [string] $datastore7 
) { 
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
    $SqlConnection.ConnectionString = GetConnectionString 
    $SqlConnection.Open() 
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
    $SqlCmd.CommandText = " SELECT db_name(sd.[database_id])AS [Database Name] 
      ,sd.mirroring_state     AS [Mirror State Number] 
      ,sd.mirroring_state_desc    AS [Mirror State] 
      ,sd.mirroring_partner_name   AS [Partner Name] 
      ,sd.mirroring_role_desc    AS [Mirror Role] 
      ,sd.mirroring_safety_level_desc  AS [Safety Level] 
      ,sd.mirroring_witness_name   AS [Witness] 
      ,sd.mirroring_connection_timeout AS [Timeout(sec)] 
     FROM sys.database_mirroring AS sd 
     WHERE mirroring_guid IS NOT null 
     ORDER BY [Database Name];" 
    $SqlCmd.Connection = $SqlConnection 
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
    $SqlAdapter.SelectCommand = $SqlCmd 
    $DataSet = New-Object System.Data.DataSet 
    $SqlAdapter.Fill($DataSet) 
    $DataSet.Tables[0] 
    $SqlConnection.Close() 
    $datastore = $DataSet.Tables[0].Rows[0][0] 
    $datastore1 = $DataSet.Tables[0].Rows[0][1] 
    $datastore2 = $DataSet.Tables[0].Rows[0][2] 
    $datastore3 = $DataSet.Tables[0].Rows[0][3] 
    $datastore4 = $DataSet.Tables[0].Rows[0][4] 
    $datastore5 = $DataSet.Tables[0].Rows[0][5] 
    $datastore6 = $DataSet.Tables[0].Rows[0][6] 
    $datastore7 = $DataSet.Tables[0].Rows[0][7] 
    $script:ServerStatus1 = "DataBase Name:"+ $datastore+",Mirror State Number"+$datastore1+",Mirror State"+$datastore2+",Partner Name"+$datastore3+",Mirror Role"+$datastore4+",Safety Level"+$datastore5+",Witness"+$datastore6+",Timeout(In Sec)"+$datastore7 
    return $script:ServerStatus1 
} 

Dies ist meine Funktion 2:

function getInsertServerStatus(
    $svr1, 
    $inst2, 
    $ServerName = $svr1+"\"+$inst2, 
    $RemActonToBeTaken = 0, 
    $ServerStatus 
) { 
    mirroring 
    $Script:ServerStatus1 
    $Script:ServerStatus= $ServerStatus1 

    Write-Host "ServerName=$ServerName" 
    Write-Host "InstanceName=$inst2" 
    Write-Host "ServerStatus=$ServerStatus1" 
    Write-Host "RemActonToBeTaken=$RemActonToBeTaken" 

    $SqlConnection1 = New-Object System.Data.SqlClient.SqlConnection 
    $SqlConnection1.ConnectionString = "Server=$svr1\$inst2;Database=master;Integrated Security=True;" 
    $SqlConnection1.Open() 
    $SqlCmd1 = New-Object System.Data.SqlClient.SqlCommand 
    $SqlCmd1.CommandText = "USP_RemedialActionDetails" 
    $SqlCmd1.Connection = $SqlConnection1 
    $SqlCmd1.CommandType = [System.Data.CommandType]::StoredProcedure 

    $InParameter1 = New-Object System.Data.SqlClient.SqlParameter; 
    $InParameter1 = $SqlCmd1.Parameters.Add("@ServerName" , [System.Data.SqlDbType]::String) 
    $InParameter1.Value = $ServerName 
    $InParameter1.Direction = [System.Data.ParameterDirection]"Input"; 

    $InParameter2 = New-Object System.Data.SqlClient.SqlParameter; 
    $InParameter2=$SqlCmd1.Parameters.Add("@InstanceName" , [System.Data.SqlDbType]::String) 
    $InParameter2.Value = $inst2 
    $InParameter2.Direction = [System.Data.ParameterDirection]"Input"; 

    $InParameter3 = New-Object System.Data.SqlClient.SqlParameter; 
    $InParameter3=$SqlCmd1.Parameters.Add("@ServerStatus" , [System.Data.SqlDbType]::String) 
    $InParameter3.Value = $ServerStatus1 
    $InParameter3.Direction = [System.Data.ParameterDirection]"Input"; 

    $InParameter4 = New-Object System.Data.SqlClient.SqlParameter; 
    $InParameter4=$SqlCmd1.Parameters.Add("@RemActionToBeTaken" , [System.Data.SqlDbType]::String) 
    $InParameter4.Value = $RemActonToBeTaken 
    $InParameter4.Direction = [System.Data.ParameterDirection]"Input"; 

    $result = $SqlCmd1.ExecuteNonQuery() 
    Write "result=$result" 
    $SqlConnection1.Close() 
    $SQLCmd1.Dispose() | Out-Null 
} 

Ich rufe Funktion mirroring innerhalb in Funktion getInsertServerStatus. Verbindungszeichenfolge in die Funktion (mirroring) Verbindungsfehler, weil nicht gefunden $server und $instance Name.

+1

Versuchen Sie, ein [MCVE] (http://stackoverflow.com/help/mcve) auszuarbeiten. Die Frage enthält viel unnötigen Code. Wenn Sie etwas entfernen, das für die Frage nicht relevant ist, wird wahrscheinlich der problematische Teil angezeigt. – vonPryz

+0

Fügen Sie auch die eigentliche Fehlermeldung hinzu. –

+0

Was soll ein Problem sein? – gofr1

Antwort

0

Es gibt einige Fehler in Ihrem Code:

ersten, innerhalb der Funktion getInsertServerStatusyou Sie Spiegelung nennen, ohne die Parameter $ svr $ inst vorbei .... es sein sollte:

mirroring $svr1 $inst1 ... other parameters 

second, Inside the function **mirroring** you call **GetConnectionString** 

ohne Parameter $ Server vorbei $ instance es sein sollte:

GetConnectionString $svr $inst 

Im Hauptprogramm Sie GetConnectionString $ Server $ Instanz aufrufen und Sie nicht den Rückgabewert auf eine Variable übergeben und keine Wirkung im Code hat, entfernen Sie diese Zeile

mit dem vorgeschlagenen Code Ändern Sie Ihren Code.

Verwandte Themen