2009-10-28 45 views
2

我想从Powershell(v2)针对SQL Server 2008数据库执行存储过程。来自使用C#作为我的主要语言,我正在以这种方式进行。例如,当我需要运行一个存储过程不返回结果,这里是我现在在做什么:从Powershell执行sproc

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

虽然也许TMTOWTDI,我想知道的最佳途径。

我应该提到我已经熟悉T-SQL和System.Data命名空间。这真的是一个关于Powershell的问题。

回答

2

对于直PowerShell的我会去的代码和你一样Andomar所写。但是,如果您使用的是PowerShell Community Extensions有一些的cmdlet与ADO工作如:

$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()运行存储过程,但不询问结果。您必须对行集使用ExecuteReader(),对于具有一个值的行使用ExecuteScalar()。

下面是这个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

对不起,我不清楚我的问题。我打算特意询问Powershell,因为我已经熟悉System.Data。 –

2

我有一个Windows Server 2008使用PowerShell 2.0和SQL Server 2008和我已经能够使用Invoke-SQLCMD执行sql对数据库。

你需要用这两个命令添加snapins:

添加-PSSnapin SqlServerCmdletSnapin100

添加-PSSnapin SqlServerProviderSnapin100

这样的调用,sqlcms将是avaliable您的PowerShell后会话看看http://technet.microsoft.com/en-us/library/cc281720.aspx使用invoke-sqlcmd的例子

+0

这太棒了,谢谢!不幸的是,该脚本将部署到没有安装SQL Server 2008的机器上:( –

+0

)这真是一个遗憾,因为我认为你会喜欢使用SQL Server cmdlet,也许你会很快升级 – 2009-12-02 20:27:06