Existe-t-il un moyen d'exécuter une requête arbitraire sur un serveur SQL en utilisant Powershell sur ma machine locale ?
Réponses
Trop de publicités?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).
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
}
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
.
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 .
- Réponses précédentes
- Plus de réponses