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

行 - 我想提高错误将阻止从运行中更新。 – 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你在哪里检查未参数不为空,下一行使用

IF (@@ROWCOUNT) < 1 

但我不明白,你正在运行一个查询,看是否提供的参数有匹配的记录。

我想你会想运行像

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

只是一个想法。

+0

感谢保罗 - 我将其标记为正确的,因为根据关你的答案,我能够改写SQL使PROC工作按预期。 – MISNole