0

我有一个数据存储层,它访问我们数据库上的一个名为Form.

我正在尝试编写一个Merge语句,该语句插入一个作为 GUID 的新 Id,如果已经有一个 Id,则更新记录。但是,我的问题是,如果没有创建 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});

我不确定要在 New for Id 中添加什么(我把它留在了???)。查询是一个对象,其中包含来自另一个表的一些数据,而文档是一个 XML 文档。

对此的任何建议都会有很大帮助。

4

1 回答 1

0

考虑将创建新 GUID 的责任转移到您的存储库,而不是让 SQL Server 为您创建它。

希望在您的存储库中,您知道您是否有正在使用的记录的 ID,或者它是否是尚未分配 ID 的新文档。

如果您没有当前文档的 ID,请使用 C# 为您创建一个新的 GUID。从这里开始,无论您是编辑现有记录还是创建新记录,代码都是相同的:您只需将 ID 变量传递给 SqlCommand(理想情况下作为参数)。

在您的WHEN NOT MATCHED声明中,您可以简单地引用SOURCE.Id而不是使用 newId()。

由于您在存储库中创建了 GUID,因此您已经知道该值是什么,您应该将其用作另一个操作的一部分(无需从 SQL Server 返回它)。

于 2016-01-26T21:53:44.960 回答