You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golang中打印存储过程返回的消息内容

解决Golang调用MSSQL存储过程获取返回消息的问题

要捕获SQL Server执行存储过程时返回的信息消息(比如"命令已成功完成"),标准的database/sql包无法直接处理,需要借助go-mssqldb驱动提供的扩展功能,具体步骤如下:

核心思路

go-mssqldb允许注册消息处理器(MessageHandler)来接收SQL Server发送的信息类消息,这些消息不属于结果集,因此无法通过Query/QueryRow方法获取。我们需要获取驱动底层的连接实例,注册回调后再执行存储过程。

完整代码示例

package main

import (
    "context"
    "database/sql"
    "fmt"
    "log"

    "github.com/denisenkom/go-mssqldb"
)

func main() {
    connString := "server=127.0.0.1;user id=sa;password=P@ssw0rd;database=msdb;"
    db, err := sql.Open("mssql", connString)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 获取底层连接
    conn, err := db.Conn(context.Background())
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // 将标准连接转换为mssql驱动特定的连接
    mssqlConn, err := mssql.Conn(conn)
    if err != nil {
        log.Fatal(err)
    }

    // 注册消息处理器,捕获SQL Server返回的信息消息
    messageChan := make(chan mssql.Message)
    mssqlConn.SetMessageHandler(func(msg mssql.Message) {
        messageChan <- msg
    })
    defer close(messageChan)

    // 执行存储过程
    ctx := context.Background()
    var result int
    err = conn.QueryRowContext(ctx, "EXEC AddNumbers @Number1=?, @Number2=?", 10, 20).Scan(&result)
    if err != nil {
        log.Fatal("执行存储过程失败: ", err)
    }

    // 打印结果集
    fmt.Println("存储过程计算结果:", result)

    // 打印捕获到的消息
    fmt.Println("SQL Server返回消息:")
    for msg := range messageChan {
        fmt.Printf("[%d] %s\n", msg.Number, msg.Text)
    }
}

关键说明

  • mssql.Conn(conn):将标准库的sql.Conn转换为驱动专属的连接实例,这样才能使用驱动的扩展功能。
  • SetMessageHandler:注册一个回调函数,所有SQL Server发送的信息类消息都会被这个函数接收,我们可以将消息存入通道统一处理。
  • 消息的类型:SQL Server返回的消息分为不同级别,比如信息级(10级)就是"命令已成功完成"这类提示,错误级会触发QueryRowContext的错误返回。

补充说明

如果你的存储过程中有PRINT语句输出自定义消息,这个方法同样可以捕获到这些内容。

内容的提问来源于stack exchange,提问作者Hsilopsy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:47:20