【发布时间】:2017-03-24 22:51:36
【问题描述】:
我有一个存储过程,它将根据县代码、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 语句。
例如,这是我目前的记录:
当我运行存储过程时:
我得到以下信息:
这是存储过程的代码。谁能帮我理解我错在哪里?
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;
【问题讨论】:
-
好吧,当然,您首先提出错误,然后运行
UPDATE -
好的 - 我认为引发错误会阻止更新运行。
-
那么,您实际上不想更新表格,除非其中一个参数是
null? -
否 - 如果参数之一为 NULL,它仍应更新。但是如果提供了这两个参数,我想确保它们与数据库中的现有记录匹配。我将尝试在原始问题中进行澄清。
-
但是你的
RAISERROR一点意义都没有
标签: tsql stored-procedures sql-server-2014