Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Azure移动服务自定义API多次调用SQL SP_Ios_Sql_Sql Server_Azure_Azure Mobile Services - Fatal编程技术网

Ios Azure移动服务自定义API多次调用SQL SP

Ios Azure移动服务自定义API多次调用SQL SP,ios,sql,sql-server,azure,azure-mobile-services,Ios,Sql,Sql Server,Azure,Azure Mobile Services,我有一个带有自定义API的Azure移动服务,它似乎在进行多个SQL调用。查看日志时,我看到SP返回了多个响应。其中一些是空返回(无记录集),而其中一个正在与SP正确通信并返回记录集 我知道我的iOS应用程序只调用自定义API一次 以下是自定义API: exports.post = function(request, response) { var mssql = request.service.mssql; var params = [request.query.First

我有一个带有自定义API的Azure移动服务,它似乎在进行多个SQL调用。查看日志时,我看到SP返回了多个响应。其中一些是空返回(无记录集),而其中一个正在与SP正确通信并返回记录集

我知道我的iOS应用程序只调用自定义API一次

以下是自定义API:

exports.post = function(request, response) {
    var mssql = request.service.mssql; 

    var params = [request.query.FirstName , 
    request.query.LastName , 
    request.query.DOB ,
    request.query.EmailAddress , 
    request.query.PhoneNumber , 
    request.query.FacilityID ,
    request.query.DiagnosisID, 
    request.query.GeneratedBy , 
    request.query.UserTypeID];

    console.log("processregistration params = '%j'", params);
    var sql = "exec MyStoredProcName ?, ?, ?, ?, ?, ?, ?, ?, ?";
    mssql.query(sql, params, {
        success: function(results) {
            console.log("results = '%j'", results);
            // I had to put this in there to keep it from returning an empty recordset
            // back to my iOS app
            if (results.length > 0) {
                response.send(statusCodes.OK, results);
            }

        }        
    });
};
以下是日志:

我知道SP只生成一个记录集,测试它直接生成一个记录集。我已经能够帮助它,但是在代码>响应之前放入if语句。发送< /代码>。我以前从来没有这样做过。有什么想法吗

编辑-这是我的SP(为carlosfigueira发布)


您遇到的问题是,您的存储过程正在执行许多中间操作(查询现有用户id、查询正在使用的电子邮件地址等),默认情况下,所有这些操作都由SQL server作为结果集返回,这就是为什么在“实”结果集之前会看到这些空结果集

您可以在存储过程中使用
SET NOCOUNT ON
语句,这将有效地从返回到
mssql.query
函数的结果集列表中删除这些中间SQL执行。您的存储过程将如下所示

ALTER PROCEDURE [carlosfigueira].[sp_Process_Registration]
    @FirstName VARCHAR(500) ,
    @LastName VARCHAR(500) ,
    @DOB DATETIME ,
    @EmailAddress VARCHAR(500) ,
    @PhoneNumber VARCHAR(25) ,
    @FacilityID INT ,
    @DiagnosisID INT ,
    @GeneratedBy NVARCHAR(500) ,
    @UserTypeID INT
AS 

SET NOCOUNT ON

DECLARE @Timestamp AS DATETIME = CURRENT_TIMESTAMP

-- rest of the stored proc code is the same

添加该语句后,传递给
mssql.query
的回调将只调用一次。

这是一个我们已经实施了修复的错误,应该很快得到纠正。不过,这不会在明年之前发生,因为我们在圣诞节和新年的几周内不会进行任何部署(除非存在安全或重大阻止问题,并且您似乎有解决问题的方法)。您是否也可以发布您的存储过程,以便我们验证我们的修复方法是否也适用于您的情况?谢谢添加了SP.Thx的SQL!顺便说一句-我想你是Azure工程团队的一员吧?如果是的话,你知道乔希·特维斯吗?谢谢!是的,我在那个团队工作,乔希是这里的朋友——我想说,是我们这里最好的朋友之一。太棒了。去年在达拉斯CocoaConf与Josh共用一辆出租车。很棒的家伙,也是我现在使用Azure的主要原因!我知道NOCOUNT是做什么的,我只是没有考虑API是如何解释这些消息的。谢谢
ALTER PROCEDURE [carlosfigueira].[sp_Process_Registration]
    @FirstName VARCHAR(500) ,
    @LastName VARCHAR(500) ,
    @DOB DATETIME ,
    @EmailAddress VARCHAR(500) ,
    @PhoneNumber VARCHAR(25) ,
    @FacilityID INT ,
    @DiagnosisID INT ,
    @GeneratedBy NVARCHAR(500) ,
    @UserTypeID INT
AS 

SET NOCOUNT ON

DECLARE @Timestamp AS DATETIME = CURRENT_TIMESTAMP

-- rest of the stored proc code is the same