当INSERT未执行时,存储过程不返回受影响的行

时间:2014-03-18 16:36:48

标签: sql sql-server stored-procedures sqlcommand

我有一个存储过程,它应该执行插入操作,但在插入之前通过IF NOT EXISTS检查主键是否已被使用。

IF NOT EXISTS(SELECT ...)
INSERT INTO ...

所以我通过代码生成主键,因为它用作令牌。我现在想要通过查看SqlCommand.ExecuteNonQuery方法的返回值来捕获生成的密钥已经存在于数据库中的非常不可能的情况,该方法应该是受影响的行的计数。

如果执行了insert,则该方法会返回“1”作为受影响行的计数,但如果由于IF语句而未执行插入,则存储过程根本不会返回受影响行的计数。它只是说'命令已成功完成'。在SQL Server Management Studio中,ExecuteNonQuery方法返回-1。

为什么会这样,我能以某种方式改变这种行为,还是这就是它的运作方式?

2 个答案:

答案 0 :(得分:0)

您可能已将NOCOUNT设置为ON ...

您可以使用以下查询在管理工作室中对此进行测试:

示例 NOCOUNT OFF:

SET NOCOUNT OFF

SELECT *
FROM [dbo].[table1]

返回(n row(s) affected)

示例 NOCOUNT ON:

SET NOCOUNT ON

SELECT *
FROM [dbo].[table1]

返回Command(s) completed successfully.

答案 1 :(得分:0)

在未执行插入时尝试返回变量,如下所示:

BEGIN

DECLARE @m_norecord int = 0      

IF NOT EXISTS(SELECT...)
INSERT INTO...
ELSE 
SELECT @m_norecord 

END