嵌套查询导致 sqlexp.ReturnMessage 出错

问题描述 投票:0回答:0

我想通过此代码从 RaisError 获取消息:

retmsg := &sqlexp.ReturnMessage{}
    rows, err = db.QueryContext(ctx, query, retmsg)
    if err != nil {
        return
    }
    active := true
    for active {
        msg := retmsg.Message(ctx)
        switch m := msg.(type) {
        case sqlexp.MsgNotice:
            result = fmt.Sprintf("%s", m.Message)
            return
        case sqlexp.MsgNext:
            inresult := true
            for inresult {
                inresult = rows.Next()
                if inresult {
                    var d interface{}
                    if err = rows.Scan(&d); err == nil {
                        result = fmt.Sprintf("%s %v", result, d)
                    }
                }
            }
        case sqlexp.MsgNextResultSet:
            active = rows.NextResultSet()
        case sqlexp.MsgError:
            result = fmt.Sprintf("%s", m.Error)
        }
    }

使用的程序代码:

declare @err_message nvarchar(255), 
        @err_count int = 0
BEGIN
    if (isnull(@InStorageID,0)=0 and isnull(@OutStorageID,0)=0)  
     begin
       SET @err_message = ' Message: empty storage '
       select @err_count=@err_count+1
       RAISERROR (@err_message,10, 1) 
     end

     if (@Quantity<0 or @Quantity=0) 
     begin
       SET @err_message = ' Message: items quantity less than zero '
       select @err_count=@err_count+1
       RAISERROR (@err_message,10, 1) 
     end

     if not exists (select 1 from [dbo].[tblQuantity] qt
                where qt.ConsignmentID=@ConsignmentID and 
                      qt.StorageID=@OutStorageID and
                      (qt.Quantity-@Quantity)>=0
                 ) and @OutStorageID>0
     begin
       SET @err_message = ' Message: the quantity of goods is more than what is in stock '
       select @err_count=@err_count+1
       RAISERROR (@err_message,10, 1) 
     end

     if (@err_count=0)...

我可以收到消息“消息:空存储”和“消息:物品数量小于零”。但是“消息:货物数量多于库存”不能。

问题开始于行:msg := retmsg.Message(ctx) 它的运行阻止了这个挂起的 sqlexp 包块。

func (m *ReturnMessage) Message(ctx context.Context) RawMessage {
    select {
    case <-ctx.Done():
        return MsgNextResultSet{}
    case raw := <-m.queue:
        return raw
    }
}

我尝试改变上下文;

将代码更改为包 sqlexp: 添加带有空消息的默认值,但仍然无法正常工作。

我试图调试以寻找错误,但没有任何效果,也许值是相同的。

在我看来,这是由于执行子查询导致等待执行时间过长,但我不确定

sql go subquery goroutine
© www.soinside.com 2019 - 2024. All rights reserved.