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
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"
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çantImport-Module SqlPs
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
Utilisez Invoke-Expression
plutôt que Invoke-Command
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))
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
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.