2016-11-10 3 views
0

У меня есть хранимая процедура, которая обновит флаг на основе кода графства, URL-адреса или их комбинации. Например, графство 03 может иметь эти две записи:Ошибка регистрации хранимой процедуры, но обновление записи

county_code = 03 
webservice_type_id = 1 
webservice_URL = http://192.168.100.3/A 

И

county_code = 03 
webservice_type_id = 2 
webservice_URL = http://192.168.100.3/B 

И если я хочу использовать хранимую процедуру, чтобы включить/отключить флаг, я должен быть в состоянии работать:

execute dbo.usp_webservice_change_status 
@enable = 1 
@county_code = '03' 
@webserviceURL = http://192.168.100.3/B 

и обновить только запись, которая соответствует обоим условиям. Но я вижу, что хранимая процедура обновляет записи для округа, но выдает инструкцию RAISERROR в хранимой процедуре.

Например, вот мои текущие записи:

enter image description here

И когда я запустить хранимую процедуру:

enter image description here

Я получаю следующее:

enter image description here

Но когда я снова смотрю на записи, я вижу, что они были обновлены: enter image description here

Вот код для хранимой процедуры. Может ли кто-нибудь помочь мне понять, где я ошибаюсь?

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

    -- Update for County Code Only 
    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; 

    -- Update for Webservice URL only 
    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; 

    -- Update for both County Code and Webservice URL - but only if the records match 
    ELSE IF (@county_code IS NOT NULL AND @webserviceURL IS NOT NULL) 
     IF (@@ROWCOUNT) < 1 
      RAISERROR('Nothing Updated Due to Non Matching Records', 15, 1); 

     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; 
+0

ну, конечно же, вы первый повышающий ошибку, а затем запустить 'UPDATE' – Lamak

+0

OK - Я думал, поднимая ошибку бы предотвратить обновление от запуска. – MISNole

+0

Итак, вы действительно не хотели обновлять таблицу, если только один из параметров не был «null»? – Lamak

ответ

0

Кода я использовал для создания правильного ответа:

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; 
DECLARE @Count INT = (SELECT COUNT(1) FROM dbo.webservice_config WHERE county_code = @county_code AND webservice_URL = @webserviceURL); 

.... 

ELSE IF (@county_code IS NOT NULL AND @webserviceURL IS NOT NULL) 
     IF @Count > 0 
      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); 

     ELSE 
      RAISERROR ('Nothing Updated Due to Non Matching Records', 15, 1); 
1

В вашем последнем ELSE IF, где вы проверяете, что оба PARAMS не пусто, то следующая строка используется

IF (@@ROWCOUNT) < 1 

Но я не вижу, где вы выполняете запрос, чтобы увидеть, если есть соответствующая запись для предоставленных параметров.

Я думаю, что вы хотите запустить что-то вроде

IF(SELECT count(1) FROM dbo.webservice_config) <> 1 
    RAISEERROR 
ELSE 
    Do your update 

Просто мысли.

+0

Поблагодарите Paul - я буду отмечать его правильно, потому что, основываясь на вашем ответе, я смог переписать SQL, чтобы заставить proc работать по назначению. – MISNole