আপনি কীভাবে পাওয়ারশেল থেকে একটি এসকিউএল সার্ভার কোয়েরি চালাবেন?


161

আমার স্থানীয় মেশিনে পাওয়ারশেল ব্যবহার করে কোনও এসকিউএল সার্ভারে একটি স্বেচ্ছাসেবী ক্যোয়ারী চালানোর কোনও উপায় আছে কি?

উত্তর:


166

অন্যদের জন্য যাদের কেবলমাত্র স্টক। নেট এবং পাওয়ারশেল (কোনও অতিরিক্ত এসকিউএল সরঞ্জাম ইনস্টল করা নেই) দিয়ে এটি করা দরকার আমি এখানে ফাংশনটি ব্যবহার করি:

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 বা তার পরে ব্যবহার করা)।


নিষ্পত্তি এখানে বা পাওয়ারশেলের ক্ষেত্রে গুরুত্বপূর্ণ নয়?
মাসলো

2
@ ম্যাসলো আমি নিশ্চিতভাবে বলতে পারি না, আমি জানি যে অবজেক্টগুলি নিষ্পত্তি না করেই এটি ভাল কাজ করে তবে আপনার যদি একক পাওয়ারসেল.এক্সই প্রক্রিয়া থাকে যা কয়েক সপ্তাহ ধরে এটি বন্ধ না করে একাধিকবার কল করবে তবে অবশেষে এটি একটি সমস্যা হতে পারে তবে আপনি এটি পরীক্ষা করতে হবে।
ক্রিস ম্যাগনসন

1
নোট করুন যে এটি আপনাকে স্ক্রিপ্টগুলি লিখতে বাধ্য করে যা স্কেল ইনজেকশন আক্রমণে ঝুঁকিপূর্ণ হতে পারে, যদি তারা কোনও উত্স থেকে অনুসন্ধানের ডেটা পড়ার উপর নির্ভর করে যা ব্যবহারকারীর ইনপুটকে নির্ভর করে।
জোয়েল কোহর্ন

4
@ AllTrades জ্যাক গুগল এসকিএল ইনজেকশন। ইনভোক-এসকিএল কমান্ডের কমান্ড পাঠ্য থেকে পৃথক পরামিতিগুলি অন্তর্ভুক্ত করার উপায় নেই। এটি অনুসন্ধানগুলি তৈরির জন্য আপনি স্ট্রিং কনটেনটেশন ব্যবহারের গ্যারান্টিযুক্ত এবং এটি একটি বড় সংখ্যা নেই।
জোয়েল কোহর্ন

1
আমার জন্য ভাল কাজ করে। যে কারও জন্য অবাক হওয়ার জন্য, কোনও জিনিস নিষ্পত্তি করার জন্য, কেবলমাত্র যুক্ত করুন $connection.dispose()I আমি জানি না যদিও এটির কোনও পার্থক্য রয়েছে কিনা
নিক.এমসিডার্মাইড

101

আপনি Invoke-Sqlcmdসেমিডলেট ব্যবহার করতে পারেন

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

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


22
কারওর উল্লেখ করা উচিত যদি আপনি
স্কিএল

10
আপনি যে কোনও জায়গায় এসকিউএল সার্ভার ক্লায়েন্ট সরঞ্জাম (এসএসএমএস) ইনস্টল থাকা চালাতে পারেন। এটি কোনও ওয়ার্কস্টেশন থেকে সূক্ষ্মভাবে কাজ করে, এটি এসকিউএল সার্ভার চালাচ্ছে কিনা।
aloc

3
সেমিডলেট উপলভ্য করতে নিম্নলিখিত আমদানি ব্যবহার করুন: Import-Module "sqlps" -DisableNameChecking
xx1xx

1
আপনি যদি এখনও এসকিউএল ২০০৮ আর 2 তে থাকেন তবে আপনাকে মডিউলটির চারপাশে একটি কাজ ব্যবহার করতে হবে: sev17.com/2010/07/10/making-a-sqlps-module
ভিনসেন্ট ডি স্মেট

2
ইনভোক-এসকিএলসিএমডি উদ্ভট প্রান্ত-কেস এবং বেমানান আচরণের একটি অফুরন্ত দুঃস্বপ্ন। কেন এটি কখনও কখনও এবং অন্যান্য সময় কলাম আউটপুট হয় না? আমার ত্রুটির বার্তা কোথায়? কেন এটি একটি কম্পিউটারে বা অন্যটি নয়? আমি কীভাবে এটি ইনস্টল করব? প্রতিটি প্রশ্নের উত্তর শেষের চেয়ে খারাপ।
Pxtl

28

এই ব্লগে আমি যে উদাহরণটি পেয়েছি তা এখানে ।

$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


1
এই সমাধান আমার জন্য কাজ অবশ্য ExecuteNonQuery()সাফল্যের শূন্য ফিরে অবস্থা যে আমি ব্যবহার: if ($cmd.ExecuteNonQuery() -ne 0)
গিক্সাবেল

দেখে মনে হচ্ছে এটি প্রভাবিত লাইনের সংখ্যা প্রদান করে। ডকস.মাইক্রোসফট.ইন- ইউএস
ডটনেট /

27

এই ফাংশনটি কোয়েরির ফলাফলগুলি পাওয়ারশেল অবজেক্টগুলির একটি অ্যারে হিসাবে ফিরিয়ে দেবে যাতে আপনি এগুলি ফিল্টারগুলিতে এবং কলামগুলিতে সহজেই অ্যাক্সেস করতে পারেন:

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( আদমের উত্তর দেখুন )?
অলোক

2
সম্ভবত কোনও বিশাল পার্থক্য নেই, তবে স্কেলডাটা রাইডাররা সাধারণত কম পছন্দ করে কারণ তারা কম সংস্থান গ্রহণ করে। এটি এখানে প্রাসঙ্গিক বলে মনে হয় না তবে আপনি পূর্বনির্মাণে ব্যবহার করতে পারেন এমন ডেটাবেলের পরিবর্তে এবং যেখানে ডেটাগুলির উত্স সম্পর্কে চিন্তা না করে ক্লজগুলি ব্যবহার করে সত্যিকারের জিনিসগুলি ফিরে পাওয়া ভাল।
এমকোব্রায়েন

1
একটি উদাহরণ ব্যবহার চমৎকার হবে।
এরিক স্নাইডার

কখনও কখনও পর্যাপ্ত তারা নেই
ফ্রেড বি

13

যদি আপনি এটি এসকিউএল সার্ভারের প্রসঙ্গে পরিবর্তে আপনার স্থানীয় মেশিনে করতে চান তবে আমি নিম্নলিখিতটি ব্যবহার করব। আমরা আমাদের সংস্থায় এটি ব্যবহার করি।

$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 এবং $ ক্যোয়ারী ভেরিয়েবল এবং আপনি যেতে ভাল হওয়া উচিত।

আমি নিশ্চিত না যে আমরা কীভাবে এটি প্রাথমিকভাবে খুঁজে পেয়েছি, তবে এখানে খুব মিল রয়েছে


12
Invoke-Sqlcmd -Query "sp_who" -ServerInstance . -QueryTimeout 3

এটি দ্বারা PowerShell কমান্ড ব্যবহার SQL এর যে সংযোগ সংখ্যা প্রদর্শন করবে
arnav

11

এসকিউএল কোয়েরি চালানোর কোনও অন্তর্নির্মিত "পাওয়ারশেল" উপায় নেই। আপনার যদি এসকিউএল সার্ভার সরঞ্জাম ইনস্টল করা থাকে তবে আপনি একটি ইনভোক-এসকিএলসিএমডি সেমিডিলেট পাবেন।

পাওয়ারশেল .NET এ অন্তর্নির্মিত হওয়ার কারণে, আপনি আপনার অনুসন্ধানগুলি চালানোর জন্য ADO.NET API ব্যবহার করতে পারেন ।


0

ভার্চার পরামিতিগুলির সাথে এসকিউএল ইঞ্জেকশনটি এড়াতে আপনি ব্যবহার করতে পারেন


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.