web-dev-qa-db-fra.com

Comment exécuter sqlcmd depuis powershell?

J'ai une chaîne dans powershell, qui contient une commande native sqlcmd. La commande elle-même peut être exécutée avec succès dans cmd.exe. J'ai du mal à les exécuter en Powershell. Quelqu'un peut aider? Merci.

C'est sql.sql

select @@servername
go
select @@servicename

C'est le résultat lorsque j'exécute la commande sqlcmd à partir de 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>

C'est le script PowerShell pour appeler la commande sqlcmd.

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

Invoke-Command $sql

Lorsque j'exécute ce script Powershell, j'ai l'erreur suivante.

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

Pour appeler un exécutable Win32, vous souhaitez utiliser l'opérateur d'appel & comme ceci:

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

Vous pouvez également cesser d'utiliser le 'SQLCMD.EXE' externe et utiliser la cmdlet Invoke-Sqlcmd à la place: 

Invoke-Sqlcmd est une cmdlet SQL Server qui exécute des scripts contenant des instructions des langages (Transact-SQL et XQuery) et des commandes prises en charge par l'utilitaire sqlcmd.

Ouvrez simplement l'utilitaire 'sqlps' et lancez

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

Veuillez consulter Exécution de SQL Server PowerShell

Vous pouvez également charger manuellement les composants logiciels enfichables SQL Server dans PowerShell avant d'utiliser 'Invoke-Sqlcmd';
pour MS SQL Server 2012, vous pouvez le faire en lançant
Import-Module SqlPs

16
user4531

Voici comment je construis des commandes externes dans mes scripts

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

Vous pouvez ensuite utiliser la variable $ args à l'intérieur de celle-ci et même la démarrer à distance.

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

Remarque:  

Cela permet de commenter chaque paramètre.

Veillez à ne pas oublier un "` "et aucun espace après eux où ils se trouvent au bout de la ligne 

5
JPBlanc

Utilisez Invoke-Expression plutôt que Invoke-Command

3
Andrew Shepherd

Le premier paramètre de position de invoke-command est -scriptblock et attend un argument de bloc de script. Pour tirer parti d'une chaîne here pour construire la commande, puis l'exécuter avec invoke-command, vous devez convertir la chaîne here en un bloc de script:

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

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

C'est ce qui a fonctionné pour moi pour utiliser sqlcmd à partir du script powershell à l'aide de l'opérateur &, voir l'exemple pour générer un fichier csv:

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

$sv a un nom de serveur comme SERVERNAME\INSTANCE

$PROCFILE est comme d:\TSTSQL\Sqlquery.SQL

$filename est d:\TSTSQL\Desiredoutfilename.CSV

$dbclean est un paramètre transmis au fichier SQL

0
Jorge Besada

Le nom de l'instance et le nom d'utilisateur doivent être pleinement qualifiés

<domain_name>\Instanc_name et <domai_name>\Username. Seul votre nom d'instance est correctement écrit.

0
user2063329