Я начинаю работать с uniqueidentifiers, и я сталкиваюсь с неожиданной проблемой.Лучший способ получить новый уникальный идентификатор из инструкции вставки SQL, все еще определяя успех или неудачу вставки?
Прежде всего, где я обычно использую SCOPE_IDENTITY(), это уже невозможно с уникальным идентификатором, хотя в концепции по-прежнему подразумевается автоматическое генерируемое значение id в результате значения по умолчанию (newid() или newsequentialid()).
Я решил использовать предложение OUTPUT в инструкции INSERT для вывода UUID в переменную таблицы. Теперь, когда я думаю об этом, предложение OUTPUT делает SCOPE_IDENTITY устаревшим, учитывая, что это намного более ясный и более мощный способ достичь того же и большего (например, получить четкий и прямой доступ к нескольким автоматически сгенерированным столбцам для всех вставленных строк).
С использованием OUTPUT, однако, мне теперь интересно, как это влияет на тест @@ rowcount, который обычно следует за вставкой. Будет ли @ @ rowcount отражать количество строк, вставленных в основную инструкцию, или количество строк, вставленных в переменную таблицы, в выходное предложение?
Вы можете подумать, что это не повлияет (т. Е. Счет должен быть одним и тем же), но это имеет значение, потому что documentation говорит, что предложение OUTPUT будет возвращать значения и заполнять таблицу, даже если инструкция insert не работает.
UPDATE, INSERT или DELETE оператор, который имеет пункт OUTPUT будет возврата строки к клиенту, даже если оператор сталкивается с ошибками и откатывается. Результат не должен использоваться, если какая-либо ошибка возникает, когда запускает инструкцию.
В нем упоминается, что @@ rowcount, в частности, всегда будет отражать внешний оператор только при использовании OUTPUT, но он упоминает, что это контекст вложенного запроса. Поскольку предложение OUTPUT в моем случае является частью самого внешнего утверждения, неясно, будет ли @@ rowcount сообщать количество строк, вставленных в выходную таблицу, если инструкция insert не работает.
declare @new_uuid TABLE (ID uniqueidentifier);
insert into Users (ID, PersonID, Username, Password, Notes, Enabled)
output INSERTED.UUID into @new_uuid
values (@id, @personid, @username, @password, @notes, @enabled)
if (@@rowcount <> 1) goto fail; --does this reflect rows inserted into Users or @new_uuid? What if the insert fails, and rows are still output to @new_uuid?
'Будет ли @ @ rowcount отражать количество строк, вставленных в основной оператор, или количество строк, вставленных в переменную таблицы, в результате вывода?' Не быть рывком, но вы дали ему шанс? Кажется, что много написано для чего-то, что легко поддается проверке. – LittleBobbyTables
Если вы часто задаете вопрос, чтобы решить проблему; и хотя я могу/попробовал/протестировал его и нашел ответ, я все равно отправляю вопрос ради сообщества, так что, если другие столкнутся с ситуацией, эта запись может помочь им. В то же время, даже если я проверю поведение экспериментально, это не отвечает на вопрос, есть ли лучший способ получить значения, или лучший способ проверить успех утверждения. Вопрос в том, как лучше всего подойти к этой простой задаче, а также продемонстрировать, как могут возникать сложные проблемы. – Triynko
Действительные рассуждения, иметь upvote! – LittleBobbyTables