简体   繁体   English

存储过程不插入数据

[英]Stored Procedure does not insert data

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). 我对SQL Server存储过程不满意,应该将用户注册到数据库中(如果该用户尚不存在)。 But, after successfully executing the procedure, no data is inserted into the Users table. 但是,成功执行该过程后,没有数据插入到Users表中。

If I run the insert statement directly, it works. 如果我直接运行insert语句,它将起作用。

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! 谢谢!

Statements that make a simple assignment always set the @@ROWCOUNT value to 1. @@ROWCOUNT (Transact-SQL) 进行简单分配的语句始终将@@ ROWCOUNT的值设置为1。 @@ ROWCOUNT(Transact-SQL)

So 所以

DECLARE @i int
SET @i = 0
PRINT @@ROWCOUNT

prints 1. 打印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 . 或将SET @REMAININGDAYS = 0移到更新语句的上方,以便在更新和@@ROWCOUNT的测试之间不进行任何操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM