从合并语句生成 Id (GUID)

Posted

技术标签:

【中文标题】从合并语句生成 Id (GUID)【英文标题】:Generate an Id (GUID) from a Merge Statement 【发布时间】:2016-01-26 17:46:51 【问题描述】:

我有一个数据存储层,它访问我们数据库中名为Form 的 SQL 表。

我正在尝试编写一个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 " +
"newId = ??????, CreatedAt = enquiry.EnquiryDate, IsComplete = 1, Data = doc);

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

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

【问题讨论】:

你在什么环境下运行这段代码? “如果没有创建 ID,我不知道 ID”。不就是你传入的ID吗?你传入一个id(我假设这是@Id,如果找到了,那么没有创建一个 @TT。我在控制台应用程序中运行 我的意思是构造 conn.ExecuteScalar&lt;Guid&gt;( 来自什么语言?我不认识它。您应该使用此处涉及的技术标记您的问题。 抱歉。它是一个名为 Dapper 的 orm。 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于从合并语句生成 Id (GUID)的主要内容,如果未能解决你的问题,请参考以下文章

SQLite - 在 SELECT INTO 语句上生成 GUID/UUID

一个生成唯一GUID的方法

C#生成唯一的ID保存到数据库

oracle生成主键唯一的id,函数SYS_GUID()

生成GUID

使用C#快速生成顺序GUID