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?
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.
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. :-)
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
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
}
}
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