Зависит.
В некоторых местах приложения будет иметь смысл сделать upsert, потому что вы не можете знать или не заботиться, должно ли текущее сохраненное состояние уже содержать запись. Тем не менее, в других местах вы хотите знать точно, и наличие записи о вставке или отсутствующей записи для обновления должно быть ошибкой.
В любом случае, когда вы решаете сделать «упор», вы должны быть осторожны, хотя из-за врожденных условий гонки. Два отдельных соединения могут пытаться обновить, оба видят @@ ROWCOUNT в 0, а затем оба пытаются вставить, что приводит к нарушению первичного ключа (если вам повезет) или хуже в несовместимом состоянии базы данных (дублирующаяся запись с разной информацией). Правильно подобрать такие операции довольно сложно. Вы должны либо убедиться, что UPDATE блокирует состояние (т. Е. Никакая другая транзакция не может быть вставлена), либо быть подготовленным к тому, чтобы ударить нарушение PK при вставке и обработать его соответствующим образом. Я предпочитаю более поздний вариант, поскольку окно условий гонки обычно довольно мало, и обработка исключения проще, чем предотвращение одновременной вставки.
Один из вариантов, который следует рассмотреть, - это использование нового оператора SQL Server 2008 MERGE , он предназначен для обработки таких случаев (и, наконец, догоняет SQL Server у других поставщиков, и Oracle, и MySQL предлагают эту функциональность для лет ...).