it-swarm.com.de

Wie führt man eine .sql-Datei mit Powershell aus?

Ich habe eine .sql Datei. Ich versuche Verbindungsstringdetails über ein Powershell-Skript zu übergeben und eine .sql-Datei aufzurufen.

Ich suchte und kam mit einem Cmdlet zu Invoke-sqlcmd. Während ich versuchte, ein Modul zu finden, das SQL entspricht, habe ich kein Modul in meinem Rechner gefunden.

Sollte ich etwas auf meinem Computer installieren (der Computer verfügt bereits über SQL Server Management Studio 2008 R2), um die Module zu erhalten, oder gibt es eine einfache Möglichkeit, .sql-Dateien mit Powershell auszuführen?

67
Samselvaprabu

Prüfen Sie, ob SQL-Snap-Ins vorhanden sind:

get-pssnapin -Registered

Name        : SqlServerCmdletSnapin100
PSVersion   : 2.0
Description : This is a PowerShell snap-in that includes various SQL Server cmdlets.

Name        : SqlServerProviderSnapin100
PSVersion   : 2.0
Description : SQL Server Provider

Wenn ja

Add-PSSnapin SqlServerCmdletSnapin100 # here lives Invoke-SqlCmd
Add-PSSnapin SqlServerProviderSnapin100

dann kannst du so etwas machen:

invoke-sqlcmd -inputfile "c:\mysqlfile.sql" -serverinstance "servername\serverinstance" -database "mydatabase" # the parameter -database can be omitted based on what your sql script does.
86
CB.

Zitiert von SQLPS-Modul importieren auf MSDN,

Die empfohlene Methode zum Verwalten von SQL Server über PowerShell besteht darin, das sqlps-Modul in eine Windows PowerShell 2.0-Umgebung zu importieren.

Also, ja, Sie könnten den von Christian beschriebenen Add-PSSnapin -Ansatz verwenden, aber es ist auch nützlich, den empfohlenen Ansatz des sqlps-Moduls zu schätzen.

Im einfachsten Fall wird davon ausgegangen, dass Sie SQL Server 2012 verwenden: sqlps ist in der Installation enthalten, sodass Sie das Modul einfach wie jedes andere laden (normalerweise in Ihrem Profil ) über Import-Module sqlps. Sie können mit Get-Module -ListAvailable überprüfen, ob das Modul auf Ihrem System verfügbar ist.

Wenn Sie nicht über SQL Server 2012 verfügen, müssen Sie nur das sqlps -Modul in Ihr Modulverzeichnis herunterladen, damit Get-Module/Import-Module ausgeführt wird finde es. Seltsamerweise macht Microsoft nicht ​​dieses Modul zum Download bereit! Chad Miller hat jedoch freundlicherweise die erforderlichen Teile zusammengestellt und bereitgestellt dieses Modul herunterladen . Entpacken Sie es in das Verzeichnis ... Documents\WindowsPowerShell\Modules und fahren Sie mit dem Import fort.

Es ist interessant festzustellen, dass der Modulansatz und der Snapin-Ansatz nicht identisch sind. Wenn Sie die Snapins laden und dann Get-PSSnapin ausführen (ohne den Parameter -Registered, um nur anzuzeigen, was Sie geladen haben), werden die SQL-Snapins angezeigt. Wenn Sie dagegen das sqlps-Modul Get-PSSnapin laden, werden die geladenen Snapins nicht angezeigt. Daher können die verschiedenen Blogeinträge, die das Cmdlet Invoke-Sqlcmd nur durch Untersuchen von Snapins testen, zu einem falsch negativen Ergebnis führen .

Update 2012.10.06

Die vollständige Geschichte über das SQLPS-Modul im Vergleich zu den SQLPS-Mini-Shell- und SQL Server-Snap-Ins finden Sie in meiner zweiteiligen Mini-Serie Praktische PowerShell für SQL Server-Entwickler und DBAs kürzlich veröffentlicht auf Simple-Talk.com, wo ich, laut einem Kommentar eines Lesers, das Problem erfolgreich "de-confused" habe. :-)

41
Michael Sorens
if(Test-Path "C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS") { #Sql Server 2012
    Import-Module SqlPs -DisableNameChecking
    C: # Switch back from SqlServer
} else { #Sql Server 2008
    Add-PSSnapin SqlServerCmdletSnapin100 # here live Invoke-SqlCmd
}

Invoke-Sqlcmd -InputFile "MySqlScript.sql" -ServerInstance "Database name" -ErrorAction 'Stop' -Verbose -QueryTimeout 1800 # 30min
5
Brent

Hier ist eine Funktion, die ich in meinem PowerShell-Profil zum Laden von SQL-Snapins habe:

function Load-SQL-Server-Snap-Ins
{
    try 
    {
        $sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

        if (!(Test-Path $sqlpsreg -ErrorAction "SilentlyContinue"))
        {
            throw "SQL Server Powershell is not installed yet (part of SQLServer installation)."
        }

        $item = Get-ItemProperty $sqlpsreg
        $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)

        $assemblyList = @(
            "Microsoft.SqlServer.Smo",
            "Microsoft.SqlServer.SmoExtended",
            "Microsoft.SqlServer.Dmf",
            "Microsoft.SqlServer.WmiEnum",
            "Microsoft.SqlServer.SqlWmiManagement",
            "Microsoft.SqlServer.ConnectionInfo ",
            "Microsoft.SqlServer.Management.RegisteredServers",
            "Microsoft.SqlServer.Management.Sdk.Sfc",
            "Microsoft.SqlServer.SqlEnum",
            "Microsoft.SqlServer.RegSvrEnum",
            "Microsoft.SqlServer.ServiceBrokerEnum",
            "Microsoft.SqlServer.ConnectionInfoExtended",
            "Microsoft.SqlServer.Management.Collector",
            "Microsoft.SqlServer.Management.CollectorEnum"
        )

        foreach ($Assembly in $assemblyList)
        { 
            $Assembly = [System.Reflection.Assembly]::LoadWithPartialName($Assembly) 
            if ($Assembly -eq $null)
                { Write-Host "`t`t($MyInvocation.InvocationName): Could not load $Assembly" }
        }

        Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0
        Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30
        Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false
        Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000

        Push-Location

         if ((Get-PSSnapin -Name SqlServerProviderSnapin100 -ErrorAction SilentlyContinue) -eq $null) 
        { 
            cd $sqlpsPath

            Add-PsSnapin SqlServerProviderSnapin100 -ErrorAction Stop
            Add-PsSnapin SqlServerCmdletSnapin100 -ErrorAction Stop
            Update-TypeData -PrependPath SQLProvider.Types.ps1xml
            Update-FormatData -PrependPath SQLProvider.Format.ps1xml
        }
    } 

    catch 
    {
        Write-Host "`t`t$($MyInvocation.InvocationName): $_" 
    }

    finally
    {
        Pop-Location
    }
}
4
David Brabant

mit 2008 Server 2008 und 2008 R2

Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100

mit 2012 und 2014

Push-Location
Import-Module -Name SQLPS -DisableNameChecking
Pop-Location
0
emekm