【问题标题】:How to get stored procedure output parameter into variable using Powershell?如何使用 Powershell 将存储过程输出参数转换为变量?
【发布时间】:2015-06-17 18:31:04
【问题描述】:

我有一个返回字符串的存储过程,我需要将结果作为 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

【问题讨论】:

    标签: powershell stored-procedures output-parameter


    【解决方案1】:

    修改你的脚本如下所示

    $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;
    

    【讨论】:

    • 是的,这就是你所缺少的;我还添加了用于捕获输出变量的行。
    • 这一行的 +1 $SqlCmd.Parameters.Add($outParameter) >> $null。这帮助我解决了另一个关于如何从管道中清除不需要的项目的问题。谢谢@Rahul。
    • 不要忘记检查System.Data.SqlClient.SqlParameter 的可用构造函数。您可以通过在实例化时设置参数值来节省一些输入。
    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2020-09-19
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多