Reputation: 100
I am going nuts with a SQL Server stored procedure, it is supposed to register an user into the database (If the user does not already exists). But, after successfully executing the procedure, no data is inserted into the Users
table.
If I run the insert statement directly, it works.
Below is the full procedure code, before you ask me, the database is empty.
--USERS
CREATE PROCEDURE [dbo].[RegisterUser]
@NAME VARCHAR(255),
@PHONENUMBER VARCHAR(255),
@STATUS INT OUT,
@REMAININGDAYS INT OUT
AS
BEGIN
SET NOCOUNT ON;
UPDATE Users WITH (serializable)
SET Name = @NAME
WHERE PhoneNumber LIKE @PHONENUMBER
SET @REMAININGDAYS = 0
IF @@rowcount = 0
BEGIN
INSERT INTO Users (Name, PhoneNumber, RegisterDate)
VALUES (@NAME, @PHONENUMBER, GETDATE())
SET @STATUS = 0
SET @REMAININGDAYS = 40
END
ELSE
BEGIN
DECLARE @USERID BIGINT
DECLARE @EXP DATETIME
SELECT TOP 1
@USERID = USERID
FROM USERS
WHERE PhoneNumber LIKE @PHONENUMBER
SELECT TOP 1
@EXP = DATEADD(day, DAYS, REGISTERDATE)
FROM SUBSCRIPTIONS
WHERE USERID = @USERID
ORDER BY [REGISTERDATE]
IF @EXP IS NULL
BEGIN
SELECT TOP 1
@EXP = DATEADD(day, 40, REGISTERDATE)
FROM USERS
WHERE USERID = @USERID
IF GETDATE() < @EXP
BEGIN
SET @STATUS = 0
SET @REMAININGDAYS = DATEDIFF(day, GETDATE(), @EXP)
END
ELSE
BEGIN
SET @STATUS = -1
END
END
ELSE
BEGIN
IF GETDATE() < @EXP
SET @STATUS = 1
ELSE
SET @STATUS = -1
END
END
END
I call it passing all parameters.
Thank you!
Upvotes: 1
Views: 1347
Reputation: 18410
Statements that make a simple assignment always set the @@ROWCOUNT value to 1. @@ROWCOUNT (Transact-SQL)
So
DECLARE @i int
SET @i = 0
PRINT @@ROWCOUNT
prints 1.
DECLARE @RC INT
UPDATE Users WITH (serializable) SET Name = @NAME
WHERE PhoneNumber LIKE @PHONENUMBER
SET @RC = @@ROWCOUNT
SET @REMAININGDAYS = 0
IF @@RC = 0
BEGIN
INSERT INTO Users <etc...>
Or move SET @REMAININGDAYS = 0
above the update statement so nothing between the update and the test of @@ROWCOUNT
.
Upvotes: 6