Как вы запускаете запрос SQL Server из PowerShell? - PullRequest
137 голосов
/ 08 декабря 2011

Есть ли способ выполнить произвольный запрос на SQL Server, используя Powershell на моей локальной машине?

Ответы [ 7 ]

140 голосов
/ 21 сентября 2013

Для тех, кому нужно сделать это, используя только стандартные .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 и с этого момента invoke-sql будет автоматически загружаться при его использовании (при условии использования powershell v3 или более поздней версии).

93 голосов
/ 08 декабря 2011

Вы можете использовать Invoke-Sqlcmd командлет

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

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

26 голосов
/ 08 декабря 2011

Вот пример, который я нашел в этом блоге .

$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.

22 голосов
/ 01 августа 2013

Эта функция будет возвращать результаты запроса в виде массива объектов PowerShell, чтобы вы могли использовать их в фильтрах и легко получать доступ к столбцам:

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
}
8 голосов
/ 09 ноября 2016
Invoke-Sqlcmd -Query "sp_who" -ServerInstance . -QueryTimeout 3
8 голосов
/ 01 августа 2013

Нет встроенного способа «PowerShell» для выполнения SQL-запроса. Если у вас установлены инструменты SQL Server , вы получите командлет Invoke-SqlCmd .

Поскольку PowerShell построен на .NET, вы можете использовать ADO.NET API для выполнения ваших запросов.

8 голосов
/ 06 июля 2013

Если вы хотите сделать это на локальном компьютере , а не в контексте сервера 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 , $ DatabaseName и $ Query , и все будет хорошо.

Я не уверен, как мы первоначально узнали это, но здесь есть нечто очень похожее .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...