Создать идентификатор (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).

Другие вопросы по тегам