我创建了以下sp。当我执行它并插入一个不存在的ID时,我希望出现一条错误消息。但是,该错误消息未得到打印...请问有人可以帮助我了解我在做什么错吗?谢谢
create procedure campaign_data
@campaign_ID bigint
as
begin
select campaignname,totalspend,clicks,impressions,totalspend/clicks as cpc
from DSP_RawData_Archive
where @campaign_ID=Campaign_ID
end
exec campaign_data 2
if @@ROWCOUNT=0 print 'Campaign_ID does not exist'
答案 0 :(得分:1)
如果您使用的是SSMS,则PRINT
语句将显示在结果窗口的Messages
选项卡下,并且不会影响控制流。
尝试使用严重程度足够高的RAISERROR
(中间参数)抛出错误,这可能会影响控制流(例如,跳至CATCH
或停止执行)。
IF @@ROWCOUNT = 0
RAISERROR('Campaign_ID does not exist', 15, 1)
答案 1 :(得分:1)
这里的问题是您@@ ROWCOUNT的范围。 @@ ROWCOUNT返回批处理中最后执行的语句的有效行数,在这种情况下,该行数来自exec campain_data 2
,而不是前一个select
。另一个例子:
BEGIN TRAN
SELECT 0 WHERE 1 = 0
PRINT @@ROWCOUNT -- Displays 0
EXEC dbo.DoSomething -- Say this procedure returns 2 rows...
PRINT @@ROWCOUNT -- Displays 2
COMMIT
这里的另一件事是,您可能希望在您的方案中显示正确的错误消息(而不是简单的PRINT
ed行)。您可以使用以下任一方法来实现此目标
RAISERROR('Display my custom error message via RAISERROR!',16,1)
或
THROW 50000,'Display my custom error message via THROW!',1
有用的文章: http://sqlhints.com/2013/06/30/differences-between-raiserror-and-throw-in-sql-server/
答案 2 :(得分:0)
尝试:
create procedure campaign_data
@campaign_ID bigint
as
begin
select campaignname,totalspend,clicks,impressions,totalspend/clicks as cpc
from DSP_RawData_Archive
where @campaign_ID=Campaign_ID
end
exec campaign_data 2
IF (SELECT @@rowcount) = 0
SELECT 'Campaign_ID does not exist'
答案 3 :(得分:0)