81 votes

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

J'ai un .sql fichier. Je suis en train de passer de la chaîne de connexion de détails par le biais d'un script Powershell et invoquer un .sql le fichier.

J'étais à la recherche et est venu avec une applet de commande liés à l' Invoke-sqlcmd. Alors que j'essayais de trouver un module correspondant à SQL, je n'ai pas trouvé dans ma machine.

Dois-je installer quelque chose dans ma machine (la machine a déjà SQL Server Management Studio 2008 R2) pour obtenir les modules ou est-il un moyen facile pour exécuter .sql fichiers à l'aide de Powershell?

98voto

CB. Points 24549

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.
 

45voto

Michael Sorens Points 9637

Citant Importer le Module SQLPS sur MSDN, "La méthode recommandée pour gérer SQL Server à partir de PowerShell est d'importer le module sqlps dans Windows PowerShell 2.0 de l'environnement." Donc, oui, vous pouvez utiliser l' Add-PSSnapin approche détaillée par Christian, mais il est également utile pour apprécier le recommandé module sqlps approche.

Le cas le plus simple suppose que vous avez SQL Server 2012: sqlps est inclus dans l'installation de sorte que vous suffit de charger le module comme toutes les autres (en général, dans votre profil) par Import-Module sqlps. Vous pouvez vérifier si le module est disponible sur votre système avec l' Get-Module -ListAvalable.

Si vous n'avez pas de SQL Server 2012, alors tout ce que vous devez faire est de télécharger le sqlps module dans votre répertoire de modules ainsi Obtenez-le Module d'Import-Module trouverez. Curieusement, Microsoft ne pas faire de ce module disponible pour le téléchargement! Toutefois, le Tchad Miller a gentiment emballé, la condition de pièces et fourni ce module de téléchargement. Décompressez-le dans votre ...Documents\WindowsPowerShell\répertoire de Modules et de procéder à l'importation.

Il est intéressant de noter que le module d'approche et le composant logiciel enfichable approche ne sont pas identiques. Si vous chargez la snapins puis exécutez Get-PSSnapin (sans les paramètres Enregistrés, pour ne montrer que ce que vous avez chargé), vous verrez le SQL snapins. Si, d'autre part, vous chargez le module sqlps Get-PSSnapin ne sera pas le snapins chargé, de ce fait, les entrées de blog que le test pour la Invoke-Sqlcmd applet de commande en examinant uniquement snapins pourrait être de donner un résultat faussement négatif.

2012.10.06 mise à Jour

Pour l'histoire complète sur le module sqlps contre la sqlps mini-shell vs SQL Server snap-ins, prendre un coup d'oeil à mes deux partie de la mini-série Pratique PowerShell pour SQL Server Développeurs et Administrateurs de bases de données récemment publiées sur Simple-Talk.com où j'ai, selon un lecteur du commentaire, avec succès "de confondre" le problème. :-)

7voto

Brent Points 360
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

5voto

David Brabant Points 11159

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
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X