我有一个数据存储库层,用于访问名为Form
的数据库中的SQL表。
我正在尝试编写一个Merge
语句,该语句插入一个新的ID,这是一个GUID,如果已有Id,则更新记录。但是,我的问题是,如果没有创建,我不知道ID。
我无法理解它。这让我想到我的陈述是否真的有效。
这是我的代码:
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});
我不知道在Id for New中放入什么(我把它留给了???)。查询是一个对象,它包含来自另一个表的一些数据,doc是一个XML文档。
对此的任何建议都会有很大的帮助。
答案 0 :(得分:0)
考虑将创建新GUID的职责移交给您的存储库,而不是让SQL Server为您创建它。
希望在您的存储库中,您知道您是否拥有正在使用的记录的ID,或者它是否是尚未分配ID的新文档。
如果您没有当前文档的ID,请使用C#为您创建新的GUID。 从现在开始,无论您是在编辑现有记录还是创建新记录,代码都是相同的:您只需将ID变量传递给SqlCommand(理想情况下作为参数)。
在WHEN NOT MATCHED
声明中,您只需引用SOURCE.Id
而不是使用newId()。
由于您在存储库中创建了GUID,因此您已经知道在将其用作另一个操作的一部分时需要使用什么值(无需从SQL Server返回)。