如何使用Powershell将存储过程输出参数获取到变量中?

如何使用Powershell将存储过程输出参数获取到变量中?,powershell,stored-procedures,output-parameter,Powershell,Stored Procedures,Output Parameter,我有一个返回字符串的存储过程,需要将结果作为powershell变量。我被输出参数语法所困扰 Powershell脚本: $SqlConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnection.ConnectionString = "Server=myserver;Database=mydb;Integrated Security=True" $SqlConnection.Open() $SqlConnecti

我有一个返回字符串的存储过程,需要将结果作为powershell变量。我被输出参数语法所困扰

Powershell脚本:

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=myserver;Database=mydb;Integrated Security=True"
$SqlConnection.Open()
$SqlConnection.State

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "testsp3"
$SqlCmd.Connection = $SqlConnection


$op = new-object System.Data.SqlClient.SqlParameter;
$op.ParameterName = "@answer";
$op.Direction = [System.Data.ParameterDirection]'Output';
$op.DbType = [System.Data.DbType]'String';
$op.Size = 2500

$SqlCmd.Parameters.Add($op);

$what = $SqlCmd.ExecuteScalar();

$what
错误消息:

调用带有“0”参数的“ExecuteScalar”时出现异常:“过程或函数'testsp3'需要参数'@answer',但未提供该参数。”

存储过程(如果重要):

CREATE PROCEDURE [dbo].[testsp3]
@answer nvarchar(max) output

AS
BEGIN
    SET NOCOUNT ON;

    SELECT @answer = 'blah blah blah'
    RETURN
END
GO

修改脚本,如下所示

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=myserver;Database=mydb;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "testsp3"
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandType = [System.Data.CommandType]'StoredProcedure'; <-- Missing
$outParameter = new-object System.Data.SqlClient.SqlParameter;
$outParameter.ParameterName = "@answer";
$outParameter.Direction = [System.Data.ParameterDirection]'Output';
$outParameter.DbType = [System.Data.DbType]'String';
$outParameter.Size = 2500;
$SqlCmd.Parameters.Add($outParameter) >> $null;
$SqlConnection.Open();
$result = $SqlCmd.ExecuteNonQuery();
$truth = $SqlCmd.Parameters["@answer"].Value;
$SqlConnection.Close();
$truth;
$SqlConnection=新对象System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString=“Server=myserver;Database=mydb;integratedsecurity=True”
$SqlCmd=New Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText=“testsp3”
$SqlCmd.Connection=$SqlConnection
$SqlCmd.CommandType=[System.Data.CommandType]'StoredProcess';>$无效的
$SqlConnection.Open();
$result=$SqlCmd.ExecuteNonQuery();
$truth=$SqlCmd.Parameters[“@answer”].Value;
$SqlConnection.Close();
$真相;

是的,这就是你所缺少的;我还添加了用于捕获输出变量的行。+1用于这一行$SqlCmd.Parameters.Add($outParameter)>$null。这帮助我回答了另一个问题,关于如何从管道中清除不需要的项目。谢谢@Rahul。别忘了检查可用的构造函数。通过以这种方式设置实例化时的参数值,可以节省一些输入。