web-dev-qa-db-fra.com

Comment exécuter un fichier .sql en utilisant powershell?

J'ai un fichier .sql. J'essaie de transmettre les détails de la chaîne de connexion via un script Powershell et d'invoquer un fichier .sql.

Je cherchais et ai mis au point une cmdlet liée à Invoke-sqlcmd. Alors que j'essayais de trouver un module correspondant à SQL, je n'en ai trouvé aucun dans ma machine.

Devrais-je installer quoi que ce soit sur ma machine (la machine dispose déjà de SQL Server Management Studio 2008 R2) pour obtenir les modules ou existe-t-il un moyen simple d'exécuter des fichiers .sql à l'aide de Powershell?

67
Samselvaprabu

Essayez de voir si des composants logiciels enfichables SQL sont présents:

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

Si c'est le cas

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

alors vous pouvez faire quelque chose comme ça:

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.

Citant de Importer le module SQLPS sur MSDN, 

La méthode recommandée pour gérer SQL Server à partir de PowerShell consiste à importer le module sqlps dans un environnement Windows PowerShell 2.0.

Donc, oui, vous pouvez utiliser l'approche Add-PSSnapin détaillée par Christian, mais il est également utile d'apprécier l'approche recommandée par le module sqlps.

Le cas le plus simple suppose que vous avez SQL Server 2012: sqlps est inclus dans l'installation, il vous suffit donc de charger le module comme un autre (généralement dans votre profil ) via Import-Module sqlps. Vous pouvez vérifier si le module est disponible sur votre système avec Get-Module -ListAvailable.

Si vous ne possédez pas SQL Server 2012, il vous suffit de télécharger le module sqlps dans votre répertoire de modules afin que Get-Module/Import-Module le trouve. Curieusement, Microsoft ne permet pas de télécharger ce module! Cependant, Chad Miller a gentiment rassemblé les éléments requis et fourni téléchargement de ce module . Décompressez-le sous votre répertoire ... Documents\WindowsPowerShell\Modules et procédez à l'importation.

Il est intéressant de noter que l'approche par module et celle par composant logiciel enfichable ne sont pas identiques. Si vous chargez les composants logiciels enfichables, exécutez Get-PSSnapin (sans le paramètre -Registered, pour afficher uniquement ce que vous avez chargé). Si, par contre, vous chargez le module sqlps, Get-PSSnapin ne montrera pas les snapins chargés, de sorte que les différentes entrées de blog qui testent la cmdlet Invoke-Sqlcmd en examinant uniquement les snapins pourraient donner un résultat faux négatif.

Mise à jour 2012.10.06

Pour en savoir plus sur le module sqlps, les composants logiciels enfichables SQL Server mini-shell et SQL Server, consultez ma mini-série en deux parties Practical PowerShell pour les développeurs et les administrateurs de base de données SQL Server récemment publié sur Simple-Talk.com où, selon le commentaire d'un lecteur, "j'ai confondu" le problème. :-)

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

Voici une fonction que j'ai dans mon profil PowerShell pour charger des composants logiciels enfichables SQL:

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

avec 2008 Server 2008 et 2008 R2

Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100

avec 2012 et 2014

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