Хранимая процедура не возвращает затронутые строки, когда INSERT не выполняется

У меня есть хранимая процедура, которая должна выполнять вставку, но сначала проверяет, используется ли уже первичный ключ, имея IF NOT EXISTS перед вставкой.

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

Поэтому я генерирую первичный ключ через код, потому что он используется как токен. Теперь я хочу поймать очень маловероятный случай, когда сгенерированный ключ уже существует в базе данных, посмотрев на возвращаемое значение метода SqlCommand.ExecuteNonQuery, которое должно быть количеством затронутых строк.

Если вставка выполняется, метод возвращает «1» в качестве количества затронутых строк, но если вставка не выполняется из-за оператора IF, хранимая процедура вообще не возвращает количество затронутых строк. Он просто говорит: «Команда (ы) выполнена успешно». в SQL Server Management Studio, поэтому метод ExecuteNonQuery возвращает -1.

Почему это так, и я могу как-то изменить это поведение или это так работает?


person DerSeegler    schedule 18.03.2014    source источник
comment
Возвращаемое значение — это количество строк, затронутых INSERT. Что вы ожидаете получить, если нет INSERT даже не произойдет? Поскольку ничего не происходит - ничего не возвращается - мне это кажется довольно логичным .... нет INSERT означает: никакие строки не затронуты этим несуществующим INSERT ....   -  person marc_s    schedule 18.03.2014
comment
Внутри вашего SP используйте @@rowcount и верните его в качестве выходного параметра.   -  person Thit Lwin Oo    schedule 18.03.2014
comment
@marc_s, поскольку вы написали, что нет строк, затронутых этим несуществующим INSERT. Вот почему я ожидал, что будет указано, что 0 затронутых строк вместо успешно выполненных команд.   -  person DerSeegler    schedule 19.03.2014


Ответы (2)


Возможно, у вас 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.

person bastos.sergio    schedule 18.03.2014

Попробуйте возвращаемую переменную, когда вставка не выполняется, например:

BEGIN

DECLARE @m_norecord int = 0      

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

END
person smoore4    schedule 18.03.2014