2012-03-15 19 views
13

Ho una stringa in powershell, che contiene un comando nativo sqlcmd. Il comando stesso può essere eseguito correttamente in cmd.exe. Ho difficoltà ad eseguirli in PowerShell. Chiunque può aiutare? Grazie.Come eseguire sqlcmd da powershell?

Questo è sql.sql

select @@servername 
go 
select @@servicename 

Questo è il risultato quando eseguo il comando sqlcmd da cmd.exe

C:\Users\test>sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql" 

-------------------------------------------------- 
thesimpsons\INSTANCE1 

(1 rows affected) 

-------------------------------------------------- 
INSTANCE1 

(1 rows affected) 

C:\Users\test> 

Questo è lo script PowerShell per chiamare il comando sqlcmd.

$sql = @" 
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql" 
"@ 

Invoke-Command $sql 

Quando eseguo questo script PowerShell, ho ricevuto il seguente errore.

PS C:\TEMP> $sql = @" 
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql" 
"@ 

Invoke-Command $sql 
Invoke-Command : Parameter set cannot be resolved using the specified named parame 
ters. 
At line:5 char:15 
+ Invoke-Command <<<< $sql 
    + CategoryInfo   : InvalidArgument: (:) [Invoke-Command], ParameterBin 
    dingException 
    + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands 
    .InvokeCommandCommand 
+0

correlati: http://stackoverflow.com/questions/1015038/powershell-sqlcmd –

risposta

18

Per chiamare un eseguibile Win32 che si desidera utilizzare l'operatore di call & come questo:

& sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql" 
3

Usa Invoke-Expression piuttosto che Invoke-Command

+0

non vedo il motivo per cui la gente cerca usare Invoke-Expression quando si chiamano i file eseguibili Win32 ... Questo è l'operatore di chiamata. –

+0

@Andy - Invoke-Expression consente di generare l'intero comando come prima stringa, che potrebbe essere utile in base alle circostanze. Vedi http://stackoverflow.com/questions/6604089/dynamically-generate-command-line-command-then-invoke-using-powershell –

+1

Sì, ma non sta succedendo qui. Utilizzare solo Invoke-Expression quando è presente un'espressione che deve essere valutata. –

5

Questo è come io costruisco alcuni esterni comando nei miei script

$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>` 
           -U a ` 
           -P a ` 
           -i `"c:\temp\sql.sql`" } 
Invoke-Command -ScriptBlock $scriptBlock 

È possibile it usa $ args variabile al suo interno e anche avviarlo in remoto.

$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>` 
           -U a ` 
           -P a ` 
           -i `"$($args[0])`" } 
Invoke-Command -ScriptBlock $scriptBlock -argumentList "c:\temp\sql.sql" -computer "remote1" 

Nota:

Questo permette di commentare ogni param.

Fare attenzione a non dimenticare un "` "e nessuno spazio dopo di loro dove si trovano alla fine della riga.

2

Il primo parametro posizionale di invoke-command è -scriptblock e prevede un argomento di blocco di script. Per usufruire di una stringa here per costruire il comando e poi eseguirlo con Invoke-Command, è necessario convertire il qui-stringa in un blocco di script:

$sql = @" 
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql" 
"@ 

Invoke-Command ([scriptblock]::create($sql)) 
+0

Tutto ciò che sta per fare è restituire il valore in $ sql, in realtà non lo eseguirà (almeno non sul mio computer). –

+0

Hai ragione. Aggiornerò quella risposta – mjolinor

13

Si potrebbe anche smettere di usare l'esterno 'SQLCMD .EXE' e utilizzare il Invoke-Sqlcmd cmdlet invece:

Invoke-Sqlcmd è un cmdlet di SQL Server che esegue gli script che contengono le dichiarazioni dalle lingue (Transact-SQL e XQuery) e comandi supportati da sqlcmd

Basta aprire l'utilità 'sqlps' ed eseguire

Invoke-Sqlcmd -InputFile "C:\temp\sql.sql" 

Si prega di vedere Running SQL Server PowerShell

È inoltre possibile caricare manualmente gli snap-in di SQL Server in PowerShell prima di utilizzare "Invoke-Sqlcmd";
per MS SQL Server 2012 è possibile farlo eseguendo
Import-Module SqlPs

+1

Mentre la risposta di Andi Arismendi è buona, e risponde direttamente all'esecuzione dell'eseguibile sqlcmd, credo che questa dovrebbe essere la risposta accettata. Se stai eseguendo script sqlcmd tramite powershell, ti farà risparmiare tempo, fatica e tasti per usare semplicemente Invoke-Sqlcmd. – ascary

+4

1. Invoke-Sqlcmd non implementa tutti i comandi disponibili con SQLCMD. 2. Invoke-Sqlcmd non è incluso nell'installazione di base di PowerShell – DonBecker

+0

Invoke-Sqlcmd aggiunge un punto e virgola alla fine delle stored procedure, causando problemi con gli strumenti di confronto. Vedere https://social.msdn.microsoft.com/Forums/sqlserver/en-US/74d8acd4-9788-48e5-93bc-fa165a573ee2/powershell-invokesqlcmd-adding-semicolon?forum=sqltools e https: //www.reddit .com/r/PowerShell/commenti/5v29o2/options_for_executing_sql_server_script/ – kevinpo

0

Sia nome dell'istanza e il nome utente dovrebbe essere completo

<domain_name>\Instanc_name e <domai_name>\Username. Solo il nome dell'istanza è stato correttamente copiato.

0

Questo è ciò che ha funzionato per me per l'utilizzo di sqlcmd all'interno dello script PowerShell utilizzando l'operatore &, vedi esempio per generare un file CSV:

& cmd/c "sqlcmd -S $ sv -i $ PROCFILE -s, -v varDB = $ dbclean -o $ filename"

$sv ha il nome del server come SERVERNAME\INSTANCE

$PROCFILE è come d:\TSTSQL\Sqlquery.SQL

$filename è d:\TSTSQL\Desiredoutfilename.CSV

$dbclean è un parametro passato al file sql

Problemi correlati