2016-11-10 6 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

は、ストアドプロシージャのコードです。誰かが私が間違っているところを理解するのを助けることができますか?

ELSEあなたの最後で
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

したがって、パラメータの1つが '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

あなたは、両方のparamsがnullでないことをチェックしている場合、あなたは

IF (@@ROWCOUNT) < 1 

を使用し、次の行しかし、あなたがどうかを確認するクエリを実行している私は表示されません提供されたパラメータに一致するレコードがあります。

私はあなただけの思考

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

ような何かを実行したいと思うだろう。

+0

Paulありがとうございます。答えに基づいて、私は意図したとおりにprocを動作させるためにSQLを書き直すことができたので、正しいとマークします。 – MISNole

関連する問題