177 votes

Comment exécuter 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 ma machine locale ?

182voto

Chris Magnuson Points 1009

Pour ceux qui ont besoin de faire cela avec seulement .NET et PowerShell (sans outils SQL supplémentaires installés), voici la fonction que j'utilise :

function Invoke-SQL {
    param(
        [string] $dataSource = ".\SQLEXPRESS",
        [string] $database = "MasterData",
        [string] $sqlCommand = $(throw "Please specify a query.")
      )

    $connectionString = "Data Source=$dataSource; " +
            "Integrated Security=SSPI; " +
            "Initial Catalog=$database"

    $connection = new-object system.data.SqlClient.SQLConnection($connectionString)
    $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 plus qui a écrit quelles parties. Il a été distillé à partir des exemples des autres, mais simplifié pour être clair et juste ce qu'il faut sans dépendances ou fonctionnalités supplémentaires.

Je l'utilise et le partage assez souvent pour en faire un module script sur GitHub de sorte que vous pouvez maintenant aller dans votre répertoire de modules et exécuter git clone https://github.com/ChrisMagnuson/InvokeSQL et à partir de ce moment, invoke-sql sera automatiquement chargé lorsque vous l'utiliserez (en supposant que vous utilisez PowerShell v3 ou une version ultérieure).

113voto

manojlds Points 96599

Vous pouvez utiliser le Invoke-Sqlcmd cmdlet

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

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

32voto

mcobrien Points 513

Cette fonction renvoie les résultats d'une requête sous la forme d'un tableau d'objets powershell afin que vous puissiez les utiliser dans des filtres et accéder facilement 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
}

28voto

dmc Points 1543

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 autre instruction TSQL où il est dit dbcc freeproccache .

13voto

Adam Points 21

Si vous voulez le faire sur votre machine locale plutôt que dans le contexte du serveur SQL, j'utiliserais ce qui suit. 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
$ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f $ServerName,$DatabaseName,$ConnectionTimeout
$conn.ConnectionString=$ConnectionString
$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

Il suffit de remplir le $ServerName , $DatabaseName et le $Query variables et vous devriez être prêt à partir.

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

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