2015-12-14 5 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

Работал очень хорошо! Большое спасибо! –

Смежные вопросы