2016-10-14 3 views
3

Допустим, у меня есть 2 графств:Проверка записей Перед обновлением в хранимых процедур

  • B

Каждый из них имеет свой собственный URL:

  • www.A. com
  • www.B.com

У меня есть хранимая процедура, которая принимает 3 переменные, чтобы включить или отключить службу для URL-адреса. Требуется переменная @Enable, но пользователь может ввести переменные @County_Code или @WebserviceURL - или и то, и другое. Но если они вводят оба, я хочу проверить, что запись завершена в базе данных.

Например,

EXEC [dbo].usp_webservice_change_status @enable = 1, @county_code = 'A', @webserviceURL = 'www.A.com';

должен выполнять и обновлять флаг Enable.

Но если я выполню со следующими значениями, я хотел бы, чтобы была возвращена ошибка, указывающая на то, что у округа А нет соответствующего значения www.B.com.

EXEC [dbo].usp_webservice_change_status @enable = 1, @county_code = 'A', @webserviceURL = 'www.B.com';

Вот полный хранимая процедура:

ALTER PROCEDURE [dbo].[usp_webservice_change_status] 
@enable AS BIT, 
@county_code AS CHAR(2) = NULL, 
@webserviceURL AS VARCHAR(4000) = NULL 

AS 
    BEGIN 
     SET NOCOUNT ON; 
     IF @enable IS NULL 
      RAISERROR ('The value for @enable should not be null', 15, 1); 
     IF (@county_code IS NULL AND @webserviceURL IS NULL) 
      RAISERROR ('The value for @county_code and @webserviceURL cannot both be null', 15, 1); 

IF (@county_code IS NOT NULL AND @webserviceURL IS NULL) 

UPDATE dbo.webservice_config 
SET [enable] = @enable, 
    comments = CASE 
        WHEN @enable = 1 THEN 'Enabled by ' + SUSER_SNAME() 
        ELSE 'Disabled by ' + SUSER_SNAME() 
       END  
WHERE county_code = @county_code 

ELSE IF (@county_code IS NULL AND @webserviceURL IS NOT NULL) 

UPDATE dbo.webservice_config 
SET [enable] = @enable, 
    comments = CASE 
        WHEN @enable = 1 THEN 'Enabled by ' + SUSER_SNAME() 
        ELSE 'Disabled by ' + SUSER_SNAME() 
       END  
WHERE webservice_URL = @webserviceURL 

ELSE IF (@county_code IS NOT NULL AND @webserviceURL IS NOT NULL) 

UPDATE dbo.webservice_config 
SET [enable] = @enable, 
    comments = CASE 
        WHEN @enable = 1 THEN 'Enabled by ' + SUSER_SNAME() 
        ELSE 'Disabled by ' + SUSER_SNAME() 
       END  
WHERE (county_code = @county_code AND webservice_URL = @webserviceURL) 

    END; 

ответ

1

Вы могли бы сделать это с другим утверждением IF, если я понимаю, что вы хотите правильно ... просто добавьте эти две строки в нижней части ваш PROCEDURE непосредственно перед END;

IF(@@ROWCOUNT) < 1 
RAISERROR('Nothing Updated Due to Non Matching Records',15,1) 

Так это будет выглядеть следующим образом

--all your other code 
WHERE (county_code = @county_code AND webservice_URL = @webserviceURL) 
IF(@@ROWCOUNT) < 1 
RAISERROR('Nothing Updated Due to Non Matching Records',15,1) 
END; 

Вы также можете обернуть всю вещь в другом IF если вы хотите

ELSE IF (@county_code IS NOT NULL AND @webserviceURL IS NOT NULL) 

    IF(SELECT 1 FROM dbo.webservice_config WHERE county_code = @county_code AND webservice_URL = @webserviceURL) < 1 
     RAISERROR('Nothing Updated Due to Non Matching Records',15,1) 
    ELSE 
     UPDATE dbo.webservice_config 
     SET [enable] = @enable, 
      comments = CASE 
          WHEN @enable = 1 THEN 'Enabled by ' + SUSER_SNAME() 
          ELSE 'Disabled by ' + SUSER_SNAME() 
         END  
     WHERE (county_code = @county_code AND webservice_URL = @webserviceURL) 

END; 

Вы также можете использовать EXISTS и другой синтаксис вместо того, что я использовал ... только некоторые примеры.

+0

Очень круто - ваш первый пример отлично работает. Ценить это. – MISNole

+0

Не стоит беспокоиться @MISNole – scsimon