Esiste un modo per eseguire una query arbitraria su un server SQL utilizzando Powershell sul mio computer locale?Come si esegue una query di SQL Server da PowerShell?
risposta
Ecco un esempio che ho trovato su this blog.
$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();
Presumibilmente si potrebbe sostituire una dichiarazione TSQL diversa in cui si dice dbcc freeproccache
.
È possibile utilizzare il Invoke-Sqlcmd
cmdlet
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
Se si vuole fare sul vostro macchina locale invece che nel contesto di SQL Server quindi vorrei utilizzare il seguente . È quello che usiamo nella mia azienda.
$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
è sufficiente compilare il $ ServerName, $ DatabaseName ei $ query variabili e si dovrebbe essere a posto.
Non sono sicuro di come lo abbiamo originariamente trovato, ma c'è qualcosa di molto simile here.
Questa funzione restituisce i risultati di una query come un array di oggetti PowerShell in modo da poterli utilizzare nei filtri e colonne accedere facilmente:
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
}
Perché è preferibile compilare un 'DataTable' (vedere [risposta di Adam] (http://stackoverflow.com/a/17497834/1324345))? – alroc
Probabilmente non c'è un'enorme differenza, ma i SqlDataReader sono generalmente preferiti perché consumano meno risorse. Non è probabile che ciò sia rilevante qui, ma è bello recuperare oggetti reali anziché dati che è possibile utilizzare in foreach e dove clausole senza preoccuparsi della fonte dei dati. – mcobrien
non v'è un built-in modo "PowerShell" di eseguire una query SQL. Se hai il SQL Server tools installed, riceverai un cmdlet Invoke-SqlCmd.
Poiché PowerShell è basato su .NET, è possibile utilizzare ADO.NET API per eseguire le query.
Per gli altri che hanno bisogno di fare questo con appena Stock .net e PowerShell (senza strumenti di SQL aggiuntivi installati) qui è la funzione che uso:
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
}
Ho utilizzato questo così a lungo I don' so chi ha scritto quali parti, ma questo è stato distillato dagli altri esempi, ma semplificato per essere chiaro e solo ciò che è necessario senza extra dipendenze o funzionalità.
io uso e condividere questo abbastanza spesso che ho girato questo in un modulo di script sul GitHub così che si può ora passare alla directory dei moduli ed eseguire git clone https://github.com/ChrisMagnuson/InvokeSQL
e da quel punto in avanti invoke-SQL verrà caricato automaticamente quando si passa per usarlo (supponendo che tu usi il PowerShell v3 o successivo).
non ha importanza qui o in PowerShell? – Maslow
@Maslow Non ho potuto dirlo con certezza, so che questo funziona perfettamente senza disporre degli oggetti ma se si dispone di un singolo processo di powershell.exe che lo chiamerà più volte per settimane senza chiudere, potrebbe essere un problema ma Dovresti testarlo. –
Nota che questo ti obbliga a scrivere script che potrebbero essere vulnerabili agli attacchi di SQL injection, se dipendono dalla lettura dei dati per la query da un'origine che si basa sull'input dell'utente. –
Invoke-Sqlcmd -Query "sp_who" -ServerInstance . -QueryTimeout 3
Puoi spiegare cosa fa questo codice? – RamenChef
mostrerà il numero di connessione in sql utilizzato dal comando di PowerShell –
- 1. Come si esegue una query su DynamoDB?
- 2. Come si esegue una query su una tabella di giunzione
- 3. ritorno SQL query come Array in PowerShell
- 4. esegue query sql su DataTable
- 5. Elimina database SQL Server da PowerShell
- 6. Come si esegue una query per tutte le date maggiori di una determinata data in SQL Server?
- 7. Come si uniscono le tabelle da due diverse istanze di SQL Server nella query uno SQL
- 8. Sybase, esegue stringa come query sql
- 9. Come si esegue SQL da uno script bash?
- 10. Come si conservano i tag HTML quando si esegue una query su un xml utilizzando sql?
- 11. Query ricorsiva di SQL Server
- 12. Ottieni lo schema di SQL Server tramite una query SQL?
- 13. Query SQL Server per rimuovere l'ultima parola da una stringa
- 14. insolito sql risultato della query server di
- 15. Monitoraggio il progresso di una query SQL in SQL Server
- 16. Come utilizzare una query di selezione all'interno di una query di inserimento in SQL Server 2005
- 17. Come si esegue una subquery JPQL?
- 18. Come si eliminano gli avvisi T-SQL quando si esegue uno script SQL Server 2005?
- 19. bloccato con una query in SQL Server
- 20. Come si esegue una query SQL con parametri nell'ASP classico? Ed è sicuro?
- 21. Come annullare una query UPDATE di SQL Server?
- 22. SQL Server errore di query
- 23. SQL Server query improvvisamente lento
- 24. Come si esegue una query XPath su un DOMNode?
- 25. Come si esegue una query geospaziale in Mongo?
- 26. Come si esegue una query ldap utilizzando R?
- 27. Come si esegue una query $ geoIntersects con Mongoid?
- 28. Come rallentare una query SQL?
- 29. Come si esegue una query multimediale con SASS?
- 30. Query di aggiornamento sulla tabella MySQL collegata da SQL Server
Qualcuno dovrebbe menzionare questo può essere grande se si è nel contesto del server SQL, ma non così tanto se si utilizza la stazione di lavoro ... – aikeru
È possibile eseguire questo ovunque gli strumenti client di SQL Server (SQL Server Management Studio) sono installati. Funziona bene da qualsiasi workstation, indipendentemente dal fatto che sia in esecuzione SQL Server o meno. – alroc
Utilizzare la seguente importazione per avere il cmdlet disponibile: 'Import-Module" sqlps "-DisableNameChecking' –