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

时间:2014-12-17 17:49:27

标签: sql azure-mobile-services

以下results.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);
        }
    });
});

1 个答案:

答案 0 :(得分:1)

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

另一个问题是,您在得到结果的长度方面有一个错字:正确的是length,而在您的代码中,您有lentgh。由于这是JavaScript,因此将被解释为undefined(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);
                }
            }
        }
    });
};