Comment exécutez-vous une requête SQL Server à partir de PowerShell?

Existe-t-il un moyen d’exécuter une requête arbitraire sur un serveur SQL en utilisant Powershell sur mon ordinateur local?

Pour ceux qui ont besoin de le faire avec juste stock .net et PowerShell (pas d’outils SQL supplémentaires installés), voici la fonction que j’utilise:

function Invoke-SQL { param( [ssortingng] $dataSource = ".\SQLEXPRESS", [ssortingng] $database = "MasterData", [ssortingng] $sqlCommand = $(throw "Please specify a query.") ) $connectionSsortingng = "Data Source=$dataSource; " + "Integrated Security=SSPI; " + "Initial Catalog=$database" $connection = new-object system.data.SqlClient.SQLConnection($connectionSsortingng) $command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection) $connection.Open() $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command $dataset = New-Object System.Data.DataSet $adapter.Fill($dataSet) | Out-Null $connection.Close() $dataSet.Tables } 

Je l’utilise depuis si longtemps que je ne sais pas qui a écrit les parties mais cela a été distillé à partir d’autres exemples mais simplifié pour être clair et juste ce qui est nécessaire sans dépendances ou fonctionnalités supplémentaires.

Je l’utilise et le partage assez souvent pour que je le transforme en un module de script sur GitHub afin que vous puissiez maintenant accéder au répertoire de vos modules et exécuter git clone https://github.com/ChrisMagnuson/InvokeSQL . sql sera automatiquement chargé lorsque vous l’utiliserez (en supposant que vous utilisez powershell v3 ou version ultérieure).

Vous pouvez utiliser l’applet de Invoke-Sqlcmd

 Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance" 

http://technet.microsoft.com/en-us/library/cc281720.aspx

Voici un exemple que j’ai trouvé sur ce blog .

 $cn2 = new-object system.data.SqlClient.SQLConnection("Data Source=machine1;Integrated Security=SSPI;Initial Catalog=master"); $cmd = new-object system.data.sqlclient.sqlcommand("dbcc freeproccache", $cn2); $cn2.Open(); if ($cmd.ExecuteNonQuery() -ne -1) { echo "Failed"; } $cn2.Close(); 

Vous pouvez probablement substituer une instruction TSQL différente à dbcc freeproccache .

Cette fonction renvoie les résultats d’une requête sous la forme d’un tableau d’objects Powershell. Vous pouvez donc les utiliser facilement dans les filtres et accéder aux colonnes:

 function sql($sqlText, $database = "master", $server = ".") { $connection = new-object System.Data.SqlClient.SQLConnection("Data Source=$server;Integrated Security=SSPI;Initial Catalog=$database"); $cmd = new-object System.Data.SqlClient.SqlCommand($sqlText, $connection); $connection.Open(); $reader = $cmd.ExecuteReader() $results = @() while ($reader.Read()) { $row = @{} for ($i = 0; $i -lt $reader.FieldCount; $i++) { $row[$reader.GetName($i)] = $reader.GetValue($i) } $results += new-object psobject -property $row } $connection.Close(); $results } 

Si vous voulez le faire sur votre ordinateur local plutôt que dans le contexte du serveur SQL, utilisez les éléments suivants. C’est ce que nous utilisons dans mon entreprise.

 $ServerName = "_ServerName_" $DatabaseName = "_DatabaseName_" $Query = "SELECT * FROM Table WHERE Column = ''" #Timeout parameters $QueryTimeout = 120 $ConnectionTimeout = 30 #Action of connecting to the Database and executing the query and returning results if there were any. $conn=New-Object System.Data.SqlClient.SQLConnection $ConnectionSsortingng = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f $ServerName,$DatabaseName,$ConnectionTimeout $conn.ConnectionSsortingng=$ConnectionSsortingng $conn.Open() $cmd=New-Object system.Data.SqlClient.SqlCommand($Query,$conn) $cmd.CommandTimeout=$QueryTimeout $ds=New-Object system.Data.DataSet $da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd) [void]$da.fill($ds) $conn.Close() $ds.Tables 

Remplissez simplement les variables $ ServerName , $ DatabaseName et $ Query et vous devriez être prêt.

Je ne sais pas comment nous avons découvert cela, mais il y a quelque chose de très similaire ici .

Il n’existe pas de méthode “PowerShell” intégrée pour exécuter une requête SQL. Si les outils SQL Server sont installés , vous obtenez une applet de commande Invoke-SqlCmd .

Étant donné que PowerShell est basé sur .NET, vous pouvez utiliser l’ API ADO.NET pour exécuter vos requêtes.

 Invoke-Sqlcmd -Query "sp_who" -ServerInstance . -QueryTimeout 3