Wie führe ich eine SQL-Datei mit Powershell aus?

74

Ich habe ein . sqlDatei. Ich versuche, Verbindungszeichenfolgendetails über ein Powershell-Skript zu übergeben und eine .sqlDatei aufzurufen .

Ich suchte und fand ein Cmdlet mit Bezug zu Invoke-sqlcmd. Während ich versuchte, ein Modul zu finden, das SQL entspricht, habe ich keines in meinem Computer gefunden.

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

Samselvaprabu
quelle

Antworten:

92

Versuchen Sie festzustellen, 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.
CB.
quelle
5
Verwenden Sie für SQL Server 2012 zusätzlich SqlServerCmdletSnapin110 und SqlServerProviderSnapin110 zur Registrierung.
MCRohith
@MCRohith: Danke für Ihren Mehrwert. Wirklich eine nützliche Information
Samselvaprabu
2
Nur ein FYI, da ich sicher bin, dass viele Leute auf die Frage stoßen. Mit den neueren Versionen von SQL haben sie SQLPS. Sie können einfach Import-Modul "sqlps" -DisableNameChecking zu Ihrem Skript
hinzufügen
1
@workabyte Haben Sie diese Antwort unten gelesen: stackoverflow.com/a/10923160/520612 ?? ;)
CB.
1
PSA: Bei neueren Versionen von PowerShell möchten Sie möglicherweise Imoprt-Module SQLPSstattdessen versuchen Get-Module -List | ? Name -eq sqlpsoder prüfen, ob ein oder mehrere SQLPS-Module zum Importieren verfügbar sind.
QJake
43

Zitieren aus Importieren des SQLPS-Moduls 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.

Ja, Sie könnten den Add-PSSnapinvon Christian beschriebenen Ansatz verwenden, aber es ist auch nützlich, den empfohlenen SQLPS-Modulansatz zu schätzen.

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

Wenn Sie nicht über SQL Server 2012 verfügen, müssen Sie lediglich das SQLPS- Modul in Ihr Modulverzeichnis herunterladen, damit Get-Module / Import-Module es findet. Merkwürdigerweise hat Microsoft nicht dieses Modul zum Download zur Verfügung stellen! Chad Miller hat jedoch freundlicherweise die erforderlichen Teile verpackt und dieses Modul heruntergeladen . Entpacken Sie es in Ihrem 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 ausführen Get-PSSnapin( ohne den Parameter -Registered, um nur das anzuzeigen, was Sie geladen haben), werden die SQL-Snapins angezeigt. Wenn Sie andererseits das sqlps-Modul laden, werden die geladenen Snapins Get-PSSnapinnicht angezeigt, sodass die verschiedenen Blogeinträge, die das Invoke-SqlcmdCmdlet testen, indem sie nur die Snapins untersuchen, möglicherweise zu einem falsch negativen Ergebnis führen.

2012.10.06 Update

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 Miniserie Practical PowerShell für SQL Server-Entwickler und DBAs, die kürzlich auf Simple-Talk.com veröffentlicht wurde wo ich laut einem Kommentar eines Lesers das Thema erfolgreich "entwirrt" habe. :-)

Michael Sorens
quelle
3
Beachten Sie, dass Sie das SQLPS-Modul jetzt von MS herunterladen können . mit PowerShellTools.msigibt es eine x86 und eine x64 version.
Thomasb
Get-Module -ListAvalable>> ein korrekter Befehl ist Get-Module -ListAvailable.
wut-excel
Um PowerShell mit SSMS 17 oder höher zu verwenden, installieren Sie es aus der PowerShell-Galerie mitInstall-Module -Name SqlServer
LeBleu
6
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
Brent
quelle
4

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
    }
}
David Brabant
quelle
0

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
emekm
quelle