为什么在@@ ROWCOUNT = 0时我的代码没有返回错误消息?

时间:2019-02-01 11:11:18

标签: sql sql-server stored-procedures

我创建了以下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'

4 个答案:

答案 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)

我在Sequel Server Management Studio中尝试了您的存储过程,并且在消息选项卡中看到了正确的响应。

您在哪里尝试?

enter image description here