Есть ли способ выполнить произвольный запрос на SQL Server с помощью Powershell на моей локальной машине?
Как выполнить запрос SQL Server из PowerShell?
Ответ 1
Для других, которым это нужно сделать, просто с помощью .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
}
Я использую это так долго, я не знаю, кто написал, какие части, но это было переусерднено из других примеров, но упрощено, чтобы быть ясным и просто, что нужно без дополнительных зависимостей или функций.
Я использую и разделяю это достаточно часто, чтобы превратить это в модуль script на GitHub, чтобы теперь вы могли перейти в каталог модулей и выполните git clone https://github.com/ChrisMagnuson/InvokeSQL
и с этого момента forward invoke-sql будет автоматически загружаться, когда вы его используете (при условии, что вы используете powershell v3 или новее).
Ответ 2
Вы можете использовать командлет Invoke-Sqlcmd
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
Ответ 3
Вот пример, который я нашел в этом блоге.
$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
.
Ответ 4
Эта функция возвращает результаты запроса в виде массива объектов 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
}
Ответ 5
Если вы хотите сделать это на локальной машине, а не в контексте 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, и вам должно быть хорошо идти.
Я не уверен, как мы это узнали, но есть что-то очень похожее здесь.
Ответ 6
Существует не встроенный способ PowerShell запуска SQL-запроса. Если у вас установлены инструменты SQL Server, вы получите Invoke- SqlCmd.
Поскольку PowerShell построен на .NET, вы можете использовать ADO.NET API для запуска своих запросов.
Ответ 7
Invoke-Sqlcmd -Query "sp_who" -ServerInstance . -QueryTimeout 3