API personalizada del service mobile Azure que llama a SQL SP varias veces

Tengo un service mobile de Azure con una API personalizada y parece estar haciendo múltiples llamadas SQL. Cuando miro el logging, veo respuestas múltiples del SP. Algunos de estos son retornos vacíos (sin set de loggings), mientras que uno de ellos se comunica correctamente con el SP y devuelve un set de loggings.

Sé que mi aplicación iOS solo llama a la API personalizada una vez.

Aquí está la API personalizada:

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 MyStonetworkingProcName ?, ?, ?, ?, ?, ?, ?, ?, ?"; 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); } } }); }; 

Aquí está el logging: Captura de pantalla del registro de consola

Sé que el SP solo produce un set de loggings y al probarlo produce directamente un solo set de loggings. Pude vencerlo pero poner una statement if antes de la response.send . response.send . Nunca tuve que hacer eso antes. ¿Algunas ideas?

EDITAR – Aquí está mi SP (publicado para carlosfigueira)

 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /* ========================================================================================== Author: LJ Wilson Create date: 2013-12-07 Description: Processes a new (or existing) user registration ========================================================================================== Revision History Date Initials Comments 2013-12-07 LJW Created 2013-12-18 LJW Fixed issue with InvitationCodeID */ ALTER PROCEDURE [MyApp].[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 DECLARE @Timestamp AS DATETIME = CURRENT_TIMESTAMP DECLARE @ExistingUserID AS INT = ( SELECT ID FROM MyApp.Users WHERE UserTypeID = @UserTypeID AND EmailAddress = @EmailAddress AND LastName = @LastName ) DECLARE @EmailAddressInUse AS INT = ( SELECT COUNT(ID) FROM MyApp.Users WHERE EmailAddress = @EmailAddress ) IF @ExistingUserID IS NULL BEGIN BEGIN TRAN INSERT INTO MyApp.Users ( LoginName , FriendlyName , JoinDate , PhoneNumber , EmailAddress , UserTypeID , IsActive , FacilitiesListID , AllowTexting , AllowEmail , AllowCalls , AllowAPNS , ImagePath , ShowImage , LastUpdatedBy , LastUpdatedOn , FirstName , LastName , DOB ) VALUES ( @EmailAddress , -- LoginName - nvarchar(250) NULL , -- FriendlyName - nvarchar(500) @Timestamp , -- JoinDate - datetime @PhoneNumber , -- PhoneNumber - nvarchar(50) @EmailAddress , -- EmailAddress - nvarchar(500) @UserTypeID , -- UserTypeID - smallint 1 , -- IsActive - bit NULL , -- FacilitiesListID - int NULL , -- AllowTexting - bit 1 , -- AllowEmail - bit NULL , -- AllowCalls - bit 1 , -- AllowAPNS - bit NULL , -- ImagePath - nvarchar(1000) NULL , -- ShowImage - bit @GeneratedBy , -- LastUpdatedBy - nvarchar(500) @TimeStamp , -- LastUpdatedOn - datetime @FirstName , -- FirstName - varchar(500) @LastName , -- LastName - varchar(500) @DOB -- DOB - datetime ) COMMIT TRAN SET @ExistingUserID = ( SELECT @@IDENTITY ) END BEGIN DECLARE @InvitationCode AS VARCHAR(50) = ( SELECT dbo.fnc_GenInvitationCode(@EmailAddress, @FacilityID, @DiagnosisID) ) INSERT INTO MyApp.InvitationCodes ( InvitationCode , UserID , FacilityID , InvitationGeneratedOn , GeneratedBy , DiagnosisIdentifier , InvitationActive ) VALUES ( @InvitationCode , -- InvitationCode - nvarchar(50) @ExistingUserID , -- UserID - int @FacilityID , -- FacilityID - int @Timestamp , -- InvitationGeneratedOn - datetime @GeneratedBy , -- GeneratedBy - nvarchar(500) @DiagnosisID , -- DiagnosisIdentifier - int NULL -- InvitationActive - bit ) END DECLARE @InvitationCodeID AS INT = ( SELECT ID FROM MyApp.InvitationCodes WHERE InvitationCode = @InvitationCode AND InvitationGeneratedOn = @Timestamp ) INSERT INTO MyApp.FacilitiesList ( UserID , InvitationCodeID , FacilityID , AddedOn , AddedBy ) VALUES ( @ExistingUserID , -- UserID - int @InvitationCodeID , -- InvitationCodeID - int @FacilityID , -- FacilityID - int @Timestamp , -- AddedOn - datetime @GeneratedBy -- AddedBy - nvarchar(500) ) SELECT @InvitationCode AS InvitationCode , @EmailAddressInUse AS EmailAddressInUse , @ExistingUserID AS ExistingUserID GO 

El problema que está teniendo es que su procedimiento almacenado está ejecutando muchas operaciones intermedias (consulta de identificación de usuario existente, consulta de dirección de correo electrónico en uso, etc.) y, de forma pnetworkingeterminada, todas esas operaciones se devuelven como sets de resultados por el server SQL, que es la razón por la que está viendo esos sets de resultados vacíos antes que los sets de resultados "reales".

Puede usar la instrucción SET NOCOUNT ON en su procedimiento almacenado, y eso eliminará efectivamente esas ejecuciones intermedias de SQL de la list de sets de resultados que se devuelve a la function mssql.query . Tu SPROC se vería así

 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 stonetworking proc code is the same 

Una vez que agregue esa statement, la callback pasada a mssql.query solo se invocará una vez.

Intereting Posts