【问题标题】:How to get a result from CLR stored procedure如何从 CLR 存储过程中获取结果
【发布时间】:2020-10-23 22:44:23
【问题描述】:

我在 C# 中有一个 CLR 存储过程,类似于

public partial class StoredProcedures
{  
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void DecimalToWords (decimal sum)
    {
        SqlPipe pipe = SqlContext.Pipe;
        SqlMetaData[] cols = new SqlMetaData[1];
        cols[0] = new SqlMetaData("Sum", SqlDbType.NVarChar, 1024);
        SqlDataRecord rec = new SqlDataRecord(cols);

        string result = sum.ToString();

        pipe.SendResultsStart(rec);

        rec.SetSqlString(0, new SqlString(result));
        rec.SetSqlString(0, new SqlString("End of result"));
        pipe.SendResultsEnd();
    }
}

我试着叫它

GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[DecimalToWords]
        @sum = 10002

SELECT  'Return Value' = @return_value

GO

这会将@return_value 返回为 0,并将实际过程的结果作为一个空表返回,其中包含单个列名称“sum”,我认为这意味着实际过程有效。

我也尝试过调用它

DECLARE @return_value int
Declare @tep_table table
(
  Sum varchar(1024)
)

Insert into @tep_table
EXEC    @return_value = [dbo].[DecimalToWords]
        @sum = 123

Select * From @tep_table

这也返回一个空表。

如何从我的程序中获取“结果”字符串的值?我的程序代码有问题吗?我是否调用了错误的程序?

【问题讨论】:

    标签: c# sql-server stored-procedures sqlclr


    【解决方案1】:

    你不见了SendResultsRow:

            pipe.SendResultsStart(rec);
    
            rec.SetSqlString(0, new SqlString(result));
            rec.SetSqlString(0, new SqlString("End of result"));
            pipe.SendResultsRow(rec);
            pipe.SendResultsEnd();
    

    在您的示例中,您实际上并不需要 Start/Row/End,但我认为这只是一个示例。消费结果时,只要执行过程,结果集就会发送给客户端。

    【讨论】:

      猜你喜欢
      • 2020-02-18
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 2021-09-18
      • 2018-12-27
      • 2010-11-13
      相关资源
      最近更新 更多