Upsert не вставляется

У меня есть следующий SQL

BEGIN
DECLARE @UpdateCount int
    EXEC (@UpdateSQL)
SET @UpdateCount = @@RowCount


IF (@UpdateCount < 1)
BEGIN
    EXEC (@InsertSQL)
END
END
SET NOCOUNT ON;

Это живет внутри триггера, однако он не работает, как я ожидал, он обновляется, но не вставляется, я не знаю, что мне не хватает.

SQL внутри @InsertSQL тоже в порядке, я проверял это.


person Alec.    schedule 23.02.2015    source источник
comment
Может быть, использование оператора MERGE может быть решением? msdn.microsoft.com/en-us/library/bb510625.aspx   -  person jpw    schedule 23.02.2015


Ответы (1)


Согласно документации операторы EXECUTE не влияют на @@ROWCOUNT:

https://technet.microsoft.com/en-us/library/ms187316(v=sql.110).aspx

Один из вариантов — использовать sp_executesql и выходные параметры:

DECLARE @UpdateCount int
SET @UpdateSQL = @UpdateSQL + '; select @UpdateCount = @@rowcount'
exec sp_executesql @UpdateSQL, N'@UpdateCount int output', @UpdateCount = @UpdateCount output

Однако, если честно, я не смог воспроизвести вашу проблему ни в одной версии SQL Server, которая у меня есть, так что ваша проблема должна заключаться в чем-то еще.

person Necreaux    schedule 23.02.2015
comment
Это неверно, в нем говорится, что он сохраняет количество строк, а не сбрасывает его. - person Alec.; 23.02.2015
comment
Это то, что я сказал. не влияет == сохранить правильно? Заявление, о котором идет речь в документах: операторы EXECUTE сохраняют предыдущий @@ROWCOUNT. - person Necreaux; 23.02.2015