Sql 存储过程不插入数据

Sql 存储过程不插入数据,sql,sql-server,stored-procedures,sql-insert,Sql,Sql Server,Stored Procedures,Sql Insert,我对SQL Server存储过程非常感兴趣,它应该将用户注册到数据库中(如果用户还不存在)。但是,在成功执行该过程后,没有数据插入到Users表中 如果我直接运行insert语句,它就会工作 下面是完整的程序代码,在你问我之前,数据库是空的 --USERS CREATE PROCEDURE [dbo].[RegisterUser] @NAME VARCHAR(255), @PHONENUMBER VARCHAR(255), @STATUS INT OUT, @REMAININGD

我对SQL Server存储过程非常感兴趣,它应该将用户注册到数据库中(如果用户还不存在)。但是,在成功执行该过程后,没有数据插入到
Users
表中

如果我直接运行insert语句,它就会工作

下面是完整的程序代码,在你问我之前,数据库是空的

--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
——用户
创建过程[dbo]。[RegisterUser]
@名称VARCHAR(255),
@电话号码VARCHAR(255),
@状态INT OUT,
@剩余天数
作为
开始
不计数;
使用(可序列化)更新用户
SET Name=@Name
其中PhoneNumber类似于@PhoneNumber
设置@REMAININGDAYS=0
如果@@rowcount=0
开始
插入用户(姓名、电话号码、注册日期)
值(@NAME、@PHONENUMBER、GETDATE())
设置@STATUS=0
设置@REMAININGDAYS=40
结束
其他的
开始
声明@USERID BIGINT
声明@EXP DATETIME
选择前1名
@USERID=USERID
来自用户
其中PhoneNumber类似于@PhoneNumber
选择前1名
@EXP=DATEADD(天,天,注册日期)
来自订阅
其中USERID=@USERID
由[注册日期]发出的命令
如果@EXP为空
开始
选择前1名
@EXP=日期添加(第40天,注册日期)
来自用户
其中USERID=@USERID
如果GETDATE()<@EXP
开始
设置@STATUS=0
设置@REMAININGDAYS=DATEDIFF(day,GETDATE(),@EXP)
结束
其他的
开始
设置@STATUS=-1
结束
结束
其他的
开始
如果GETDATE()<@EXP
设置@STATUS=1
其他的
设置@STATUS=-1
结束
结束
结束
我称之为传递所有参数

谢谢大家!

进行简单赋值的语句总是将@ROWCOUNT值设置为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...>
DECLARE@RC INT
使用(可序列化)SET Name=@Name更新用户
其中PhoneNumber类似于@PhoneNumber
设置@RC=@@ROWCOUNT
设置@REMAININGDAYS=0
如果@RC=0
开始
插入到用户中
或者在update语句上方移动
SET@REMAININGDAYS=0
,这样在update和测试
@@ROWCOUNT

进行简单赋值的语句之间就不会有任何内容始终将@ROWCOUNT值设置为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...>
DECLARE@RC INT
使用(可序列化)SET Name=@Name更新用户
其中PhoneNumber类似于@PhoneNumber
设置@RC=@@ROWCOUNT
设置@REMAININGDAYS=0
如果@RC=0
开始
插入到用户中

或者将
SET@REMAININGDAYS=0
移到update语句上方,这样更新和测试
@@ROWCOUNT

之间就没有什么效果了!非常感谢你!工作得很好!非常感谢你!