2015-12-14 94 views
1

我要坚持使用SQL Server存储过程,它应该注册一个用户到数据库(如果用户不存在)。但是,成功执行该过程后,没有数据被插入Users表中。存储过程不会插入数据

如果我直接运行插入语句,它的工作原理。

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

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

我称之为传递所有参数。

谢谢!

回答

6

陈述,做一个简单的任务始终将@@ ROWCOUNT值设置为1@@ROWCOUNT (Transact-SQL)

所以

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

打印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...> 

或移动SET @REMAININGDAYS = 0以上更新语句在更新和@@ROWCOUNT的测试之间没有任何关系。

+0

工作得很好!非常感谢你! –