none
Powershell et SQL Server 2008R2 RRS feed

  • 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)




    jeudi 16 août 2012 09:46

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
    mardi 4 septembre 2012 07:59
    Modérateur

Toutes les réponses

  • Bonjour,

    il faut utiliser l'échappement à l'aide de la combinaison de touches Alt-Gr + 7 :

    -Query "CREATE TABLE  `"$_.Name`""


    Beatus, qui prodest, quibus potest.

    jeudi 16 août 2012 12:04
    Modérateur
  • 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.GetScriptCommand

    J'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
    jeudi 16 août 2012 13:03
  • 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 :

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

    A vérifier.


    Beatus, qui prodest, quibus potest.

    jeudi 16 août 2012 20:01
    Modérateur
  • 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
    lundi 3 septembre 2012 08:33
  • 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 hello

    Je ne comprends pas trop pourquoi j'obtiens l'erreur dans l'autre fonction du coup...

    lundi 3 septembre 2012 09:34
  • >>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
    mardi 4 septembre 2012 07:59
    Modérateur
  • 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 !


    mardi 4 septembre 2012 09:24
  • >>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 :

    ftp://ftp-developpez.com/laurent-dardenne/articles/Windows/PowerShell/Usage-du-dynamisme-sous-PowerShell/fichiers/Usage-du-dynamisme-sous-PowerShell.pdf

    >>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.

    mardi 4 septembre 2012 18:12
    Modérateur