获取非参数化存储过程查询的输出参数

本文关键字:参数 输出 查询 获取 存储过程 | 更新日期: 2023-09-27 18:09:15

我有这个存储过程

CREATE PROCEDURE [dbo].[TestProcedure] 
     @param1 int = 0
    ,@param2 int = 0
    ,@total_sales int = 5 OUTPUT 
AS
BEGIN
    SET NOCOUNT ON;
    SET @total_sales = @total_sales * 5
    SELECT * FROM SomeTable
END

c#中的这个字符串

string strSQL = @"
                DECLARE @RC int
                DECLARE @param1 int
                DECLARE @param2 int
                DECLARE @total_sales int
                -- TODO: Set parameter values here.
                SET @param1 = 1
                SET @param2 = 2
                EXECUTE @RC = [TestDB].[dbo].[TestProcedure] 
                   @param1
                  ,@param2
                  ,@total_sales OUTPUT";

现在我想检索输出值,,但不参数化输入查询 !

我试过了:

using (System.Data.SqlClient.SqlCommand cmd = (System.Data.SqlClient.SqlCommand)idbConn.CreateCommand())
{
   cmd.CommandText = strSQL;
   cmd.Transaction = (System.Data.SqlClient.SqlTransaction)idbtTrans;
   iAffected = cmd.ExecuteNonQuery();
   idbtTrans.Commit();
   string strOutputParameter = cmd.Parameters["@total_sales"].Value.ToString();
   Console.WriteLine(strOutputParameter);
} // End Using IDbCommand

这会抛出一个异常(参数@total_sales不在参数列表中)。

如何在没有参数化查询的情况下检索非参数化存储过程调用中的输出参数?

获取非参数化存储过程查询的输出参数

简短的回答:你不能。

长话短说:你需要使用ADO。

好吧,我不确定这是否有帮助,但以下操作在技术上是可行的:

在TSQL脚本中,使用RAISERROR来引发信息消息。您可以使用它来返回关于变量的名称和值的信息。例如

DECLARE @Msg NVARCHAR(200)
SET @Msg = 'totalsales=5' -- construct string of form : VariableName=ValueAsString
RAISERROR(@Msg, 10, 1)

在c#中使用SqlConnection。InfoMessage事件来捕获这些消息。解析返回的字符串以提取名称和值。这是一种返回参数值的迂回方式,但它可以工作。