如何在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
相关产品推荐
相关产品推荐

