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

J'ai un . file sql . J'essaie de transmettre les détails de la string de connection via un script Powershell et d'appeler un file .sql .

Je cherchais et suis venu avec une cmdlet liée à Invoke-sqlcmd . Pendant que j'essayais de find un module correspondant à SQL, je n'en ai trouvé aucun dans ma machine.

Dois-je installer quelque chose sur mon ordinateur (la machine a déjà SQL Server Management Studio 2008 R2) pour get les modules ou existe-t-il un moyen facile d'exécuter des files .sql en utilisant Powershell?

Essayez de voir si des snap-ins 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 du module sqlps recommandée.

Le cas le plus simple suppose que vous avez SQL Server 2012: sqlps est inclus dans l'installation afin que vous chargiez simplement le module comme n'importe quel 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 n'avez pas SQL Server 2012, alors tout ce que vous avez à faire est de download le module sqlps dans votre directory de modules afin que Get-Module / Import-Module le trouve. Curieusement, Microsoft ne rend pas ce module disponible en téléchargement! Cependant, Chad Miller a gentiment empackageé les pièces requirejses et fourni le téléchargement de ce module . Décompressez-le sous votre directory … Documents \ WindowsPowerShell \ Modules et continuez l'import.

Il est intéressant de noter que l'approche module et l'approche snapin ne sont pas identiques. Si vous chargez les snapins alors lancez Get-PSSnapin ( sans le paramètre -Registered, pour afficher uniquement ce que vous avez chargé), vous verrez les snapins SQL. Si, en revanche, vous chargez le module sqlps, Get-PSSnapin pas les snapins chargés. Par conséquent, les différentes inputs de blog qui testent la cmdlet Invoke-Sqlcmd en examinant uniquement les snapins peuvent donner un faux résultat négatif.

2012.10.06 Mise à jour

Pour l'histoire complète sur le module sqlps vs le mini-shell sqlps vs SQL Server, jetez un oeil à ma mini-série Practical PowerShell en deux parties pour les développeurs SQL Server et DBA récemment publié sur Simple-Talk.com D'après le commentaire d'un lecteur, j'ai réussi à «déconcentrer» la question. 🙂

 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 le chargement des snapins 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