Yerel makinemde Powershell kullanarak SQL Server'da rasgele bir sorgu yürütmenin bir yolu var mı?
Yerel makinemde Powershell kullanarak SQL Server'da rasgele bir sorgu yürütmenin bir yolu var mı?
Yanıtlar:
Bunu sadece .net ve PowerShell (ek SQL araçları yüklü değil) ile yapmanız gereken diğerleri için burada kullandığım işlev:
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
}
Bunu çok uzun zamandır kullanıyorum, kimin hangi kısımları yazdığını bilmiyorum ama bu başkalarının örneklerinden damıtıldı, ancak açık olması ve ekstra bağımlılıklar veya özellikler olmadan neyin gerekli olduğu basitleştirildi.
Bu işlemi, GitHub'da bir komut dosyası modülüne dönüştürdüğüm kadar sık sık kullanıyorum ve paylaşıyorum, böylece şimdi modül dizininize gidip çalıştırabilirsiniz git clone https://github.com/ChrisMagnuson/InvokeSQL
ve bu noktadan sonra ileri çağırmak-sql kullanmaya başladığınızda otomatik olarak yüklenecektir (varsayarak) powershell v3 veya daha yenisini kullanmanız).
$connection.dispose()
vb eklemek için . Ama herhangi bir fark
Invoke-Sqlcmd
Cmdlet'i kullanabilirsiniz
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
Import-Module "sqlps" -DisableNameChecking
İşte bu blogda bulduğum bir örnek .
$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();
Muhtemelen söylediği yerde farklı bir TSQL ifadesi kullanabilirsiniz dbcc freeproccache
.
ExecuteNonQuery()
başarı üzerine ben kullanımının olduğu koşulunu sıfır döndürdü: if ($cmd.ExecuteNonQuery() -ne 0)
.
Bu işlev, bir sorgunun sonuçlarını powershell nesneleri dizisi olarak döndürür; böylece bunları filtrelerde ve erişim sütunlarında kolayca kullanabilirsiniz:
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
}
DataTable
( bkz.Adam'ın cevabı )?
SQL sunucusu bağlamında yerine yerel makinenizde yapmak istiyorsanız , aşağıdakileri kullanırdım. Şirketimde kullandığımız şey bu.
$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
Sadece $ ServerName , $ DatabaseName ve $ Query değişkenlerini doldurun ve gitmekte fayda var.
Başlangıçta bunu nasıl öğrendiğimizden emin değilim, ama burada çok benzer bir şey var .
SQL sorgusu çalıştırmanın yerleşik bir "PowerShell" yolu yoktur. Eğer varsa SQL Server araçları yüklü , bir alırsınız Çağır-sqlCmd cmdlet.
PowerShell .NET üzerine kurulu olduğundan , sorgularınızı çalıştırmak için ADO.NET API'sini kullanabilirsiniz.
Varchar parametreleri ile SQL enjeksiyonu önlemek için kullanabilirsiniz
function sqlExecuteRead($connectionString, $sqlCommand, $pars) {
$connection = new-object system.data.SqlClient.SQLConnection($connectionString)
$connection.Open()
$command = new-object system.data.sqlclient.sqlcommand($sqlCommand, $connection)
if ($pars -and $pars.Keys) {
foreach($key in $pars.keys) {
# avoid injection in varchar parameters
$par = $command.Parameters.Add("@$key", [system.data.SqlDbType]::VarChar, 512);
$par.Value = $pars[$key];
}
}
$adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
$dataset = New-Object System.Data.DataSet
$adapter.Fill($dataset) | Out-Null
$connection.Close()
return $dataset.tables[0].rows
}
$connectionString = "..."
$sql = "select top 10 Message, TimeStamp, Level from dbo.log "+
"where Message = @MSG and Level like @LEVEL ";
$pars = @{
MSG = 'this is a test from powershell';
LEVEL = 'aaa%';
};
sqlExecuteRead $connectionString $sql $pars