admin

Azure移动服务,自定义API,更新输出并随后选择返回空结果

sql

在明确更新该行的同时,以下result.length始终为0。

exports.get=function(request,response){
    var mssql=request.service.mssql;
    var sql="declare @tableId table(id nvarchar(255)); update mytable set myfield=1 output inserted.id into @tableId where id=(select top 1 id from mytable where myfield is null order by date); select id from @tableId;";
    mssql.query(sql, {
        success:function(results){
            if(results.lentgh==1)
                response.send(statusCodes.OK, results[0]);
            else
                response.send(statusCodes.OK,null);
        }
    });
});

阅读 280

收藏
2021-06-07

共1个答案

admin

传递给该mssql.query函数的SQL命令具有两个语句:更新和选择。这些语句中的每一个都会生成一个“结果”(对成功回调的调用)。由于您是在获得第一个结果时发送响应的,而这是update调用的结果(不会“返回”任何内容),因此即使更新了某些内容,您的API也会始终返回空响应。

另一个问题是您在获取结果的长度时有错别字:正确的是length,而在代码中则是lentgh。由于这是JavaScript,因此它将被解释为未定义(0),并且“
if”子句将永远不会执行。

尝试用下面的代码替换该代码,并且在进行更新时应该开始看到响应。

exports.get = function(request, response) {
    var mssql=request.service.mssql;
    var sql="declare @tableId table(id nvarchar(255)); update mytable set myfield=1 output inserted.id into @tableId where id=(select top 1 id from mytable where myfield is null order by date); select id from @tableId;";
    var firstResponse = true;
    mssql.query(sql, {
        success : function(results) {
            if (firstResponse) {
                // result from the update call, can ignore
                firstResponse = false;
            } else {
                if(results.length == 1) {
                    response.send(statusCodes.OK, results[0]);
                } else {
                    response.send(statusCodes.OK,null);
                }
            }
        }
    });
};
2021-06-07