2

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

$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的问题。

4

3 回答 3

2

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

您需要使用以下两个命令添加管理单元:

添加-PSSnapin SqlServerCmdletSnapin100

添加-PSSnapin SqlServerProviderSnapin100

完成此操作后,Invoke-sqlcms 将可用于您的 PowerShell 会话,请查看http://technet.microsoft.com/en-us/library/cc281720.aspx以获取使用 invoke-sqlcmd 的示例

于 2009-11-13T11:05:29.773 回答
2

对于直接 PowerShell,我会使用您和 Andomar 编写的代码。但是,如果您使用的是PowerShell 社区扩展,则有一些用于使用 ADO 的 cmdlet,例如:

$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

...
于 2009-10-29T06:33:15.157 回答
1

ExecuteNonQuery() 运行存储过程但不询问结果。您必须将 ExecuteReader() 用于行集,或 ExecuteScalar() 用于具有一个值的一行。

这是这个不错的教程中的一个示例:

$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]
于 2009-10-28T12:04:17.980 回答