क्या मेरे स्थानीय मशीन पर Powershell का उपयोग करते हुए SQL सर्वर पर एक मनमाना क्वेरी निष्पादित करने का एक तरीका है?
क्या मेरे स्थानीय मशीन पर Powershell का उपयोग करते हुए SQL सर्वर पर एक मनमाना क्वेरी निष्पादित करने का एक तरीका है?
जवाबों:
दूसरों के लिए, जिन्हें केवल स्टॉक .net और PowerShell (कोई अतिरिक्त SQL उपकरण स्थापित नहीं) के साथ ऐसा करने की आवश्यकता है, यहां वह फ़ंक्शन है जो मैं उपयोग करता हूं:
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
}
मैं इसे बहुत लंबे समय से इस्तेमाल कर रहा हूं, मुझे नहीं पता कि किसने कौन से हिस्से लिखे लेकिन यह दूसरे के उदाहरणों से डिस्टिल्ड था लेकिन स्पष्ट होने के लिए सरलीकृत किया गया था और अतिरिक्त निर्भरता या सुविधाओं के बिना बस जरूरत है।
मैं इसे अक्सर उपयोग करता हूं और साझा करता हूं कि मैंने इसे GitHub पर एक स्क्रिप्ट मॉड्यूल में बदल दिया है ताकि आप अब अपने मॉड्यूल निर्देशिका पर जा सकें और निष्पादित कर सकें git clone https://github.com/ChrisMagnuson/InvokeSQL
और उस बिंदु से आगे इनवॉइस-लोड हो जाएगा जब आप इसका उपयोग करने के लिए जाएंगे (अनुमान लगाते हुए आपके शक्तियां v3 या बाद के संस्करण का उपयोग करते हुए)।
$connection.dispose()
आप Invoke-Sqlcmd
cmdlet का उपयोग कर सकते हैं
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
Import-Module "sqlps" -DisableNameChecking
यहाँ एक उदाहरण मुझे इस ब्लॉग पर मिला है ।
$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();
संभवतः आप एक अलग TSQL बयान स्थानापन्न कर सकते हैं जहाँ यह कहता है dbcc freeproccache
।
ExecuteNonQuery()
सफलता पर शून्य वापस आ गया, जिस स्थिति का मैं उपयोग करता हूं वह है if ($cmd.ExecuteNonQuery() -ne 0)
:।
यह फ़ंक्शन पॉवरशेल ऑब्जेक्ट्स की एक सरणी के रूप में एक क्वेरी के परिणाम लौटाएगा ताकि आप उन्हें फ़िल्टर में उपयोग कर सकें और कॉलम आसानी से एक्सेस कर सकें:
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
( एडम का जवाब देखें )।
यदि आप इसे SQL सर्वर के संदर्भ में अपने स्थानीय मशीन पर करना चाहते हैं तो मैं निम्नलिखित का उपयोग करूंगा। यह वही है जो हम अपनी कंपनी में उपयोग करते हैं।
$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
बस $ ServerName , $ डेटाबेसनाम और $ क्वेरी चर भरें और आपको जाने के लिए अच्छा होना चाहिए।
मुझे यकीन नहीं है कि हमें मूल रूप से यह कैसे पता चला, लेकिन यहां बहुत कुछ समान है ।
SQL क्वेरी चलाने का कोई अंतर्निहित "PowerShell" तरीका नहीं है। यदि आपके पास SQL सर्वर उपकरण स्थापित हैं , तो आपको एक Invoke-SqlCmd मिलेगा cmdlet ।
क्योंकि PowerShell .NET पर बनाया गया है, इसलिए आप अपने प्रश्नों को चलाने के लिए ADO.NET API का उपयोग कर सकते हैं ।
वर्कशॉप मापदंडों के साथ SQL इंजेक्शन से बचने के लिए आप इसका उपयोग कर सकते हैं
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