Meilleur auteur de réponses
Powershell et SQL Server 2008R2

Question
-
Bonjour,
Ma question tient du PS1 mais aussi (et surtout de SQL Server). Je souhaite faire une requête Invoke-Sqlcmd qui fait un SELECT Name puis qui crée une vue nommée NAME.
Pour tester la connectivité j'ai lancé ça :
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "Server\instance"
La cmd a bien fonctionné.
J'ai ensuite testé ça :
Invoke-Sqlcmd -Query "SELECT DISTINCT Name FROM Users;" -ServerInstance "Server\instance" -Database "DBName"
Qui me retourne bien les Login 1 par 1.
Puis j'ai essayé de lancer la création de la table :
Invoke-Sqlcmd -Query "SELECT DISTINCT Name FROM Users;" -ServerInstance "Server\instance" -Database "DBName" | foreach{Invoke-Sqlcmd -Query "CREATE TABLE '"$_.Name"'" -ServerInstance "Server\instance" -Database "DBName"}
J'obtiens ces erreurs :
Invoke-Sqlcmd : Impossible de trouver un paramètre positionnel acceptant l'argument « DUPONT ».
Au niveau de C:\Temp\script.ps1 : 1 Caractère : 148
+ Invoke-Sqlcmd -Query "SELECT DISTINCT Name FROM Users;" -ServerInstance "Server\instance" -Database "DBName" | foreach{
Invoke-Sqlcmd <<<< -Query "CREATE TABLE '"$_.Name"';" -ServerInstance "Server\instance" -Database "DBName"}
+ CategoryInfo : InvalidArgument: (:) [Invoke-Sqlcmd], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
Qu'est-ce que j'ai mal fait ? Merci ! :-)
De plus, savez-vous si la commande Invoke-Sqlcmd peut être lancée depuis un Server 2003 ? (sans module donc)
- Modifié MarDr jeudi 16 août 2012 09:54
- Type modifié Dan BajenaruMicrosoft employee jeudi 23 août 2012 11:40 Attente de Feedback
- Type modifié MarDr mardi 4 septembre 2012 09:25
Réponses
-
>>Je ne comprends pas trop pourquoi j'obtiens l'erreur dans l'autre fonction du coup...
Il faut revoir ta construction de la requête. Un exemple :
$server='Srv01' $Instance='SQLEXPRESS' $SrvInstance="$Server\$Instance" $Base="Test" $Users=Invoke-Sqlcmd -Query "SELECT DISTINCT Name FROM Users" -ServerInstance $SrvInstance -Database $Base $Users| Foreach { $Query=@" CREATE TABLE [$($_.Name)] (First_Name char(50) ) "@ Write-host $query -fore Green Invoke-Sqlcmd -Query $Query -ServerInstance $SrvInstance -Database $Base }
Beatus, qui prodest, quibus potest.
- Marqué comme réponse MarDr mardi 4 septembre 2012 09:25
Toutes les réponses
-
-
Tout d'abord merci pour ta réponse et pour le tips :-)
En faisant celà j'obtiens cette erreur :
Invoke-Sqlcmd : Les méthodes WriteObject et WriteError ne peuvent pas être appelées en dehors des substitutions des méthodes BeginProcessing, ProcessRecord et EndProcessing, et uniquement à partir du même thread. Vérifiez que l'applet de commande effectue correctement ces appels ou contactez les services de support technique Microsoft. Au niveau de C:\Temp\8bbb31e9-0d29-460c-bd11-c578d4db8c51.ps1 : 1 Caractère : 14
+ Invoke-Sqlcmd <<<< -Query "SELECT DISTINCT Name FROM Users" -ServerInstance "Server\instance" -Database "DBName" | for
each{Invoke-Sqlcmd -Query "CREATE VIEW `"$_.Name`" AS SELECT Login FROM ADLogin" -ServerInstance "Server\instance" -Database "DBName" }
+ CategoryInfo : InvalidResult: (Server\instance:PSObject) [Invoke-Sqlcmd], PSInvalidOperationException
+ FullyQualifiedErrorId : ExecutionFailed,Microsoft.SqlServer.Management.PowerShell.GetScriptCommandJ'ai essayé "CREATE VIEW Coucou AS SELECT Login FROM ADLogin" directement dans ma DB et elle fonctionne direct. Je vais regarder cett ehistoire de WriteObject..
- Modifié MarDr jeudi 16 août 2012 13:19
-
Joli bug ;-)
Si tu as le temps signale le sur MSConnect.
Je ne connais pas ce cmdlet, peut être que l'imbrication d'appel à Invoke-SQLCmd dans le même pipeline pose pb ? J'ai un doute sur l'usage du foreach.
Dans ce cas essaie de décomposer tes instructions, récupère d'abord une collection de noms, puis itère sur cette collection :
A vérifier.$Users=Invoke-Sqlcmd -Query "SELECT DISTINCT Name FROM Users;" -ServerInstance "Server\instance" -Database "DBName" $Users|Invoke-Sqlcmd -Query {"CREATE TABLE `"$_.Name`""} -ServerInstance "Server\instance" -Database "DBName"
#ou
$Users|% {Invoke-Sqlcmd -Query "CREATE TABLE `"$_.Name`"" -ServerInstance "Server\instance" -Database "DBName"}
Beatus, qui prodest, quibus potest.
-
Bonjour,
Comment avez-vous avancé concernant votre souci?
Cordialement,
Dan
Dan BAJENARU, MSFT Votez! Appel à la contribution
Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte. -
Bonjour :-)
Toutes mes excuses j'étais partie en congés.
Pour l'instant j'ai testé ça, et ça fonctionne :
"Pierre","Tom" | %{Invoke-Sqlcmd -Query "CREATE TABLE $_ (First_Name char(50));" -ServerInstance "server\instance" -Database "dbName"}
Par contre lors que j'adapte mon script à mon besoin, les erreurs arrivent.
En faisant ça :
$Users = Invoke-Sqlcmd -Query "SELECT DISTINCT Name FROM Users;" -ServerInstance "server\instance" -Database "dbName" $Users | %{Invoke-Sqlcmd -Query "CREATE TABLE `"$_.Name`" (First_Name char(50));" -ServerInstance "server\instance" -Database "dbName"}
J'obtiens cette erreur : "Invoke-Sqlcmd : There is already an object named 'System.Data.DataRow.Name' in the database." Ok je viens de comprendre que ça me crée une table nommée 'System.Data.DataRow.Name'.
Et en faisant ça :
$Users = Invoke-Sqlcmd -Query "SELECT DISTINCT Name FROM Users;" -ServerInstance "server\instance" -Database "dbName" $Users | %{Invoke-Sqlcmd -Query "CREATE TABLE "$_.Name" (First_Name char(50));" -ServerInstance "server\instance" -Database "dbName"}
J'obtiens l'erreur normale : "Invoke-Sqlcmd : Impossible de trouver un paramètre positionnel acceptant l'argument « Tom »."
- Modifié MarDr lundi 3 septembre 2012 09:17
-
Je fais aussi ça :
$Users | %{Write-Host "hello" $_.Name "hello"}
qui m'affiche :
hello Tom hello
hello Pierre hello
hello Martin hello
hello Sam hello
hello Mika hello
hello Hana hello
hello Maria helloJe ne comprends pas trop pourquoi j'obtiens l'erreur dans l'autre fonction du coup...
-
>>Je ne comprends pas trop pourquoi j'obtiens l'erreur dans l'autre fonction du coup...
Il faut revoir ta construction de la requête. Un exemple :
$server='Srv01' $Instance='SQLEXPRESS' $SrvInstance="$Server\$Instance" $Base="Test" $Users=Invoke-Sqlcmd -Query "SELECT DISTINCT Name FROM Users" -ServerInstance $SrvInstance -Database $Base $Users| Foreach { $Query=@" CREATE TABLE [$($_.Name)] (First_Name char(50) ) "@ Write-host $query -fore Green Invoke-Sqlcmd -Query $Query -ServerInstance $SrvInstance -Database $Base }
Beatus, qui prodest, quibus potest.
- Marqué comme réponse MarDr mardi 4 septembre 2012 09:25
-
Hé ben ! Ca fonctionne :-)
Je n'ai pas trop compris à quoi correspond le [$ avant le [$($_.Name)] par contre. En tout cas la construction de ta requête est vraiment beaucoup plus propre que la mienne... j'ai encore du travail pour m'améliorer ;-)
Merci beaucoup Dardenne Laurent !
-
>>Je n'ai pas trop compris à quoi correspond le [$ avant le [$($_.Name)] par contre.
Le caractère [ est propre à SqlServer, on a donc [UneExpressionPowershell], pour le reste consulte tout ou partie de ce tutoriel :
>>j'ai encore du travail pour m'améliorer ;-)
Je travaille ave PowerShell depuis 2006, j'ai pris un peu d'avance ;-)
Beatus, qui prodest, quibus potest.