2011-12-07 22 views

risposta

19

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.

73

È possibile utilizzare il Invoke-Sqlcmd cmdlet

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

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

+16

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

+8

È 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

+3

Utilizzare la seguente importazione per avere il cmdlet disponibile: 'Import-Module" sqlps "-DisableNameChecking' –

6

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.

15

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 
} 
+0

Perché è preferibile compilare un 'DataTable' (vedere [risposta di Adam] (http://stackoverflow.com/a/17497834/1324345))? – alroc

+2

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

97

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

+0

non ha importanza qui o in PowerShell? – Maslow

+0

@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. –

+1

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

2
Invoke-Sqlcmd -Query "sp_who" -ServerInstance . -QueryTimeout 3 
+1

Puoi spiegare cosa fa questo codice? – RamenChef

+0

mostrerà il numero di connessione in sql utilizzato dal comando di PowerShell –

Problemi correlati