В зависимости от размера ваших данных и фактического состояния у вас есть два основных подхода:
1) использование MERGE
MERGE TOP (...) INTO table1
USING table2 ON table1.column = table2.column
WHEN MATCHED
THEN UPDATE SET table1.counter += 1
WHEN NOT MATCHED SOURCE
THEN INSERT (...) VALUES (...);
*Требуется 1009 *, потому что когда вы делаете огромное обновление, подобное этому (вы упоминаете, что таблица «большая», большая - относительная, но давайте предположим, что действительно большие строки + 100 ММ), вам придется пакетировать обновления, в противном случае вы будетепереполните журнал транзакций одной гигантской транзакцией.
2) используйте курсор, как вы пытаетесь.Ваш исходный вопрос может быть легко решен, просто всегда обновите и затем проверьте количество обновленных строк:
UPDATE table
SET column += 1
WHERE ...;
IF @@ROW_COUNT = 0
BEGIN
-- no match, insert new value
INSERT INTO (...) VALUES (...);
END
Обратите внимание, что этот подход опасен, хотя из-за условий гонки: нет ничегочтобы предотвратить одновременную вставку значения другим потоком, чтобы вы могли получить либо дубликаты, либо ошибку нарушения ограничения (предпочтительно последний ...).