2009-10-28 5 views
2

Je souhaite exécuter une procédure stockée à partir de Powershell (v2) par rapport à une base de données SQL Server 2008. Venant d'utiliser C# comme langue principale, je le fais de cette façon. Par exemple, quand je dois courir un sproc qui ne renvoie pas, voici ce que je fais maintenant:Exec sproc de Powershell

$con = new-object System.Data.SqlClient.SqlConnection($connectionString) 
$cmd = new-object System.Data.SqlClient.SqlCommand("exec MySproc", $con) 
$con.Open() 
$cmd.ExecuteNonQuery() 
$cn.Close() 

Alors que peut-être TMTOWTDI, je voudrais connaître la meilleure façon.

Je dois mentionner que je suis déjà familier avec T-SQL et l'espace de noms System.Data. C'est vraiment une question à propos de Powershell.

Répondre

2

Pour PowerShell droite j'irais avec le code comme vous et Andomar avez écrit. Toutefois, si vous utilisez le PowerShell Community Extensions il y a des cmdlets pour travailler avec ADO par exemple:

$conn = 'Data Source=.\SQLEXPRESS;Initial Catalog=pubs;Integrated Security=SSPI' 
$ds = Invoke-AdoCommand -ProviderName SqlClient -ConnectionString $conn ` 
      -CommandText 'Select * from Authors' -AsDataSet 
$ds.Tables 


au_id : 172-32-1176 
au_lname : White 
au_fname : Johnson 
phone : 408 496-7223 
address : 10932 Bigge Rd. 
city  : Menlo Park 
state : CA 
zip  : 94025 
contract : True 

... 
1

ExecuteNonQuery() exécute une procédure stockée mais ne demande pas de résultats. Vous devez utiliser ExecuteReader() pour un ensemble de lignes ou ExecuteScalar() pour une ligne avec une valeur.

Voici un exemple de ce nice tutorial:

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "..." 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = "sp_helpdb" 
$SqlCmd.Connection = $SqlConnection 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$SqlAdapter.Fill($DataSet) 
$SqlConnection.Close() 
$DataSet.Tables[0] 
+0

Désolé, je n'étais pas clair avec ma question. Je voulais parler spécifiquement de Powershell, car je suis déjà familier avec System.Data. –

2

J'ai un Windows Server 2008 avec PowerShell 2.0 et SQL Server 2008 et je l'ai été en mesure d'utiliser le Invoke-SQLCMD pour exécuter sql contre une base de données.

Vous aurez besoin d'ajouter les snapins avec ces deux commandes:

Add-PSSnapin SqlServerCmdletSnapin100

Add-PSSnapin SqlServerProviderSnapin100

Après avoir fait ce Invoke-sqlcms sera avaliable à votre PowerShell session jetez un oeil à http://technet.microsoft.com/en-us/library/cc281720.aspx pour des exemples d'utilisation de l'invoke-sqlcmd

+0

C'est génial, merci! Malheureusement, le script sera déployé sur des machines sans SQL Server 2008 installé :( –

+0

C'est dommage car je pense que vous auriez aimé utiliser les cmdlets SQL Server, peut-être que vous aurez bientôt à mettre à niveau –