Создать идентификатор (GUID) из оператора слияния
У меня есть слой хранилища данных, который обращается к таблице SQL в нашей базе данных под названием Form
,
Я пытаюсь написать Merge
оператор, который вставляет новый идентификатор, который является идентификатором GUID, и обновляет запись, если идентификатор уже существует. Однако моя проблема в том, что я не знаю идентификатор, если он не создан.
Я не могу разобраться с этим. Это заставило меня задуматься, сработает ли вообще мое заявление.
Это мой код:
conn.ExecuteScalar<Guid>(
"MERGE INTO [dbo].[Form] AS TARGET USING(VALUES(@Id,@CreatedAt,@IsComplete,@Data)) AS SOURCE(Id,CreatedAt,IsComplete,[Data]) " +
"ON TARGET.Id = SOURCE.Id WHEN MATCHED THEN " +
"UPDATE SET CreatedAt = SOURCE.CreatedAt,IsComplete = SOURCE.IsComplete, [Data] = SOURCE.[Data] " +
"WHEN NOT MATCHED BY TARGET THEN " +
"INSERT(Id,CreatedAt,IsComplete,[Data]) " +
"VALUES(newId(),CreatedAt,IsComplete,[Data]) OUTPUT INSERTED.Id " +
"new{Id = ??????, CreatedAt = enquiry.EnquiryDate, IsComplete = 1, Data = doc});
Я не уверен, что положить в New для Id (я оставил его с???). Запрос представляет собой объект, который содержит некоторые данные из другой таблицы, а документ представляет собой документ XML.
Любые предложения по этому вопросу будут очень полезны.
1 ответ
Попробуйте переместить ответственность за создание нового GUID в свой репозиторий вместо того, чтобы SQL Server создавал его для вас.
Надеемся, что в вашем хранилище вы знаете, есть ли у вас идентификатор для записи, с которой вы работаете, или это новый документ, которому еще не присвоен идентификатор.
Если у вас нет идентификатора для текущего документа, используйте C#, чтобы создать для вас новый GUID. С этого момента код будет одинаковым независимо от того, редактируете ли вы существующую запись или создаете новую: вы просто передаете переменную ID в SqlCommand (в идеале в качестве параметра).
В вашем WHEN NOT MATCHED
заявление, которое вы можете просто сослаться на SOURCE.Id
вместо использования newId().
Поскольку вы создали GUID в репозитории, вы уже знаете, какое это значение, если вам нужно использовать его как часть другой операции (не нужно возвращать его из SQL Server).