로컬 컴퓨터에서 Powershell을 사용하여 SQL Server에서 임의 쿼리를 실행하는 방법이 있습니까?
로컬 컴퓨터에서 Powershell을 사용하여 SQL Server에서 임의 쿼리를 실행하는 방법이 있습니까?
답변:
스톡 .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 이상 사용).
$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()
성공하면 0을 반환했습니다 if ($cmd.ExecuteNonQuery() -ne 0)
. 사용 조건은 다음과 같습니다 .
이 함수는 쿼리 결과를 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
}
DataTable
( Adam 's answer 참조 )?
당신이 그것을하고 싶은 경우 로컬 컴퓨터 대신 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 변수를 입력하기 만하면 됩니다.
SQL 쿼리를 실행하는 기본 제공 "PowerShell"방법은 없습니다. 당신이있는 경우 SQL Server 도구를 설치 , 당신은 얻을 것이다 호출-SQLCMD cmdlet을.
PowerShell은 .NET을 기반으로하므로 ADO.NET API 를 사용 하여 쿼리를 실행할 수 있습니다.
varchar 매개 변수로 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