2016-11-10 4 views
0

Ich habe eine gespeicherte Prozedur, die ein Flag basierend auf einem County Code, einer URL oder einer Kombination von beiden aktualisiert. Zum Beispiel 03 Landkreis könnte diese beiden Datensätze:Stored Procedure Throwing Error, aber Datensatz aktualisieren

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

Und

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

Und wenn ich möchte, dass meine gespeicherten Prozedur verwenden, um das Flag zu aktivieren/deaktivieren, soll ich in der Lage sein zu laufen:

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

und nur den Datensatz aktualisieren, der beide Bedingungen erfüllt. Aber was ich sehe, ist, dass die gespeicherte Prozedur die Datensätze für den Kreis aktualisiert, aber die RAISERROR-Anweisung in der gespeicherten Prozedur auslöst.

Zum Beispiel, hier sind meine aktuellen Datensätze:

enter image description here

Und wenn ich laufen die gespeicherte Prozedur:

enter image description here

Ich erhalte die folgende:

enter image description here

Aber wenn ich mir die Aufzeichnungen sehen wieder, ich sehe, dass sie wurden aktualisiert: enter image description here

Hier ist der Code für die gespeicherte Prozedur ist. Kann mir jemand helfen zu verstehen, wo ich falsch liege?

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

gut, natürlich, werden Sie zuerst den Fehler verursacht, und dann eine 'UPDATE' – Lamak

+0

OK laufen - ich dachte, den Fehler erhöhen das würde verhindern Aktualisierung von ausgeführt werden. – MISNole

+0

Sie wollten also die Tabelle eigentlich nicht aktualisieren, wenn einer der Parameter nicht 'null' war? – Lamak

Antwort

0

Der Code, den ich verwendet, um die richtige Antwort zu erzeugen:

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

In Ihrem letzten ELSE IF, wo Sie überprüfen, dass beide params nicht null sind, wird die nächste Zeile verwenden Sie

IF (@@ROWCOUNT) < 1 

Aber ich sehe nicht, wo Sie eine Abfrage ausgeführt wird, um zu sehen, ob Es gibt einen passenden Datensatz für die bereitgestellten Parameter.

Ich würde denken, dass Sie so etwas wie

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

nur ein Gedanke laufen möchte.

+0

Danke Paul - Ich werde es richtig markieren, weil ich basierend auf Ihrer Antwort das SQL umschreiben konnte, damit der Proc wie vorgesehen funktioniert. – MISNole