আমার স্থানীয় মেশিনে পাওয়ারশেল ব্যবহার করে কোনও এসকিউএল সার্ভারে একটি স্বেচ্ছাসেবী ক্যোয়ারী চালানোর কোনও উপায় আছে কি?
আমার স্থানীয় মেশিনে পাওয়ারশেল ব্যবহার করে কোনও এসকিউএল সার্ভারে একটি স্বেচ্ছাসেবী ক্যোয়ারী চালানোর কোনও উপায় আছে কি?
উত্তর:
অন্যদের জন্য যাদের কেবলমাত্র স্টক। নেট এবং পাওয়ারশেল (কোনও অতিরিক্ত এসকিউএল সরঞ্জাম ইনস্টল করা নেই) দিয়ে এটি করা দরকার আমি এখানে ফাংশনটি ব্যবহার করি:
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
}
আমি এটি এত দিন ব্যবহার করে আসছি আমি জানি না কে এই অংশগুলি লিখেছেন তবে এটি অন্যের উদাহরণগুলি থেকে ছড়িয়ে দেওয়া হয়েছিল তবে এটি পরিষ্কার করার সহজ সরল এবং অতিরিক্ত নির্ভরতা বা বৈশিষ্ট্যগুলি ছাড়া কী প্রয়োজন।
আমি এটি প্রায়শই যথেষ্ট ব্যবহার করি এবং ভাগ করি যে আমি এটিকে গিটহাবের স্ক্রিপ্ট মডিউলে পরিণত করেছি যাতে আপনি এখন আপনার মডিউল ডিরেক্টরিতে গিয়ে এক্সিকিউট করতে পারেন git clone https://github.com/ChrisMagnuson/InvokeSQL
এবং সেই বিন্দু থেকে আপনি যখন এটি ব্যবহার করতে যান তখন আগমন-এসকিএল স্বয়ংক্রিয়ভাবে লোড হবে (ধরে নিবেন) আপনার পাওয়ারশেল ভি 3 বা তার পরে ব্যবহার করা)।
$connection.dispose()
I আমি জানি না যদিও এটির কোনও পার্থক্য রয়েছে কিনা
আপনি Invoke-Sqlcmd
সেমিডলেট ব্যবহার করতে পারেন
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();
সম্ভবত আপনি এটি একটি আলাদা টিএসকিউএল স্টেটমেন্ট যেখানে পরিবর্তন করতে পারে সেখানে বিকল্প করতে পারে 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
( আদমের উত্তর দেখুন )?
যদি আপনি এটি এসকিউএল সার্ভারের প্রসঙ্গে পরিবর্তে আপনার স্থানীয় মেশিনে করতে চান তবে আমি নিম্নলিখিতটি ব্যবহার করব। আমরা আমাদের সংস্থায় এটি ব্যবহার করি।
$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 , $ databasename এবং $ ক্যোয়ারী ভেরিয়েবল এবং আপনি যেতে ভাল হওয়া উচিত।
আমি নিশ্চিত না যে আমরা কীভাবে এটি প্রাথমিকভাবে খুঁজে পেয়েছি, তবে এখানে খুব মিল রয়েছে ।
এসকিউএল কোয়েরি চালানোর কোনও অন্তর্নির্মিত "পাওয়ারশেল" উপায় নেই। আপনার যদি এসকিউএল সার্ভার সরঞ্জাম ইনস্টল করা থাকে তবে আপনি একটি ইনভোক-এসকিএলসিএমডি সেমিডিলেট পাবেন।
পাওয়ারশেল .NET এ অন্তর্নির্মিত হওয়ার কারণে, আপনি আপনার অনুসন্ধানগুলি চালানোর জন্য ADO.NET API ব্যবহার করতে পারেন ।
ভার্চার পরামিতিগুলির সাথে এসকিউএল ইঞ্জেকশনটি এড়াতে আপনি ব্যবহার করতে পারেন
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