【问题标题】:Calling SQL Server stored procedure from powershell从 powershell 调用 SQL Server 存储过程
【发布时间】:2015-05-08 02:14:47
【问题描述】:

我正在尝试从 PowerShell 调用 SQL Server 存储过程,但我总是收到参数错误。

存储过程有8个参数,都是默认值

@simchain   nvarchar
@idSimulation    int
@idCompany   varchar
@modelName  nvarchar
@simDate    datetime
@mySim           int
@statusFloor     int
@statusCap       int

即使没有任何参数,我也可以在 Management Studio 中调用此过程,因此只需执行 EXEC [dbo].[E_simulations] 即可。

我在 PowerShell 中创建了一个连接和一个命令,但我总是在缺少参数时收到错误,例如

过程或函数“E_simulations”需要参数“@simchain”,但未提供。

这是我的测试代码(只是为了测试是否正确执行)

    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection;
    $SqlConnection.ConnectionString = $ConnectionString;
    $SqlCommand = $SqlConnection.CreateCommand();
    $SqlCommand.CommandText = "EXEC [dbo].[E_simulations]";
    $SqlConnection.Open();
    $returnedValue = $SqlCommand.ExecuteNonQuery();

我错过了什么吗?

【问题讨论】:

  • 存储过程是否有所有参数的默认值?如果没有,我也看不出它如何从 SSMS 工作。从 Powershell(或任何应用程序代码)调用 proc 的正确方法是仅在 CommnadText 中指定 proc 名称并指定 CommandType = CommandType.StoredProcedure。您需要添加所需的参数。
  • 确保它们对每个参数都有默认值。我尝试添加$SqlCommand.CommandType = [System.Data.CommandType]::StoredProcedure,但即使我想使用默认值,我现在是否也要添加所有参数?
  • 您不需要在 proc 标头中添加具有默认值的参数。我刚刚对您的代码(StoredProcedure 命令类型版本)进行了快速测试,它运行没有错误,没有向集合中添加任何参数。仅当我删除参数默认值时才会收到错误消息。检查以确保您连接到与 SSMS 中相同的服务器和数据库。
  • 所以你是说我太愚蠢了,我花了两个小时在生产服务器上运行这段代码,而不是在更新过程的测试服务器上运行这段代码?你以为我这么傻吗??真的???是你说的吗???嗯......你是对的......谢谢你;)
  • 去过那里,做到了:-)

标签: sql-server powershell stored-procedures


【解决方案1】:

我已经做了快速测试。我希望这会有所帮助

制作测试过程:

CREATE PROC doTest (
    @param1 INT = 1,
    @param2 VARCHAR(10) = 'xxx' 
)
AS
BEGIN

PRINT 'THIS ONE'
SELECT 1 As Data

END

找到执行proc的PowerShell代码:

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=localhost;Database=ForTests;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "doTest"
$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]

执行结果给了这个

Data
----
1

我所做的一切都和你写的一样,我没有分配参数就得到了结果

【讨论】:

  • 感谢您的完整测试,最后代码似乎很好但我测试错了
  • 如果要显式提供 param1 和 param2,如何执行存储过程?
  • @HappyLee 使用参数属性$sqlCmd.Parameters.Add("@hdr", $hdr)$hdr 可以是您要传递的值,当然也可以修改 @hdr 为预期的参数
猜你喜欢
  • 1970-01-01
  • 2014-03-30
  • 2021-05-26
  • 2012-02-10
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多