it-swarm.com.de

Wie man sqlcmd von Powershell aus ausführt?

Ich habe eine Zeichenfolge in Powershell, die einen systemeigenen Befehl sqlcmd enthält. Der Befehl selbst kann in cmd.exe erfolgreich ausgeführt werden. Ich habe Schwierigkeiten, sie in Powershell auszuführen. Kann jeder helfen? Vielen Dank.

Das ist sql.sql

select @@servername
go
select @@servicename

Dies ist das Ergebnis, wenn ich den Befehl sqlcmd von cmd.exe aus ausführe

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>

Dies ist das Powershell-Skript zum Aufrufen des Befehls sqlcmd.

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

Invoke-Command $sql

Beim Ausführen dieses Powershell-Skripts wurde der folgende Fehler angezeigt.

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
16
Ogrish Man

Um eine ausführbare Win32-Datei aufzurufen, verwenden Sie den Aufrufoperator & wie folgt:

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

Sie können auch die Verwendung des externen 'SQLCMD.EXE' beenden und stattdessen das Cmdlet Invoke-Sqlcmd verwenden: 

Invoke-Sqlcmd ist ein SQL Server-Cmdlet, das Skripts mit Anweisungen aus den Sprachen (Transact-SQL und XQuery) und Befehlen ausführt, die vom Dienstprogramm sqlcmd unterstützt werden

Öffnen Sie einfach das Dienstprogramm 'sqlps' und führen Sie es aus

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

Bitte sehen Sie SQL Server PowerShell ausführen

Sie können die SQL Server-Snap-Ins auch manuell in PowerShell laden, bevor Sie 'Invoke-Sqlcmd' verwenden.
für MS SQL Server 2012 können Sie dies durch Ausführen ausführen
Import-Module SqlPs

16
user4531

So baue ich einige externe Kommandos in meinen Skripten

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

Sie können dann die $ args-Variable in ihr verwenden und sie sogar remote starten.

$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"

Anmerkung :  

Dies erlaubt es, jeden Parameter zu kommentieren.

Vergessen Sie nicht, ein "` "und kein Leerzeichen hinter ihnen am Ende der Zeile zu vergessen. 

5
JPBlanc

Verwenden Sie Invoke-Expression anstelle von Invoke-Command

3
Andrew Shepherd

Der erste Positionsparameter von invoke-command ist -scriptblock und erwartet ein Skriptblockargument. Um einen Here-String zu nutzen, um den Befehl zu erstellen und ihn dann mit invoke-command auszuführen, müssen Sie den Here-String in einen Skriptblock konvertieren:

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

 Invoke-Command ([scriptblock]::create($sql))
2
mjolinor

Dies hat bei mir für die Verwendung von sqlcmd aus dem Powershell-Skript mit dem Operator & funktioniert. Siehe Beispiel zum Generieren einer CSV-Datei:

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

$sv hat einen Servernamen wie SERVERNAME\INSTANCE

$PROCFILE ist wie d:\TSTSQL\Sqlquery.SQL

$filename ist d:\TSTSQL\Desiredoutfilename.CSV

$dbclean ist ein Parameter, der an die SQL-Datei übergeben wird

0
Jorge Besada

Sowohl der Instanzname als auch der Benutzername sollten vollständig qualifiziert sein

<domain_name>\Instanc_name und <domai_name>\Username. Nur der Name Ihrer Instanz ist korrekt skriptiert.

0
user2063329