【问题标题】:GUIDs in SQL ServerSQL Server 中的 GUID
【发布时间】:2025-11-28 11:30:01
【问题描述】:

我有一个 ASP.NET 应用程序,它通过 C# 在代码隐藏中生成 GUID。这些 GUID 是通过以下方式生成的:

Guid id = Guid.NewGuid();

此 GUID 稍后存储在 SQL Server 2008 数据库中。我还有一个存储过程可以更新该记录。我想在存储过程中生成一个与 ASP.NET 中生成的格式相同的 GUID。

谁能告诉我怎么做?

谢谢!

【问题讨论】:

  • “格式相同”是什么意思? GUID 是二进制的 - 一系列 16 个字节。

标签: c# sql guid


【解决方案1】:

使用NEWID()方法

DECLARE @ID uniqueidentifier
SET @ID = NEWID()

【讨论】:

    【解决方案2】:

    如果这是针对聚集索引(通常是主键),我强烈推荐NEWSEQUENTIALID()(SQL Server 2005 以上版本),因为NEWID() 在这种情况下会创建一个碎片索引,是真正随机的。

    【讨论】:

    • newsequentialid() 只能被指定为列的默认约束——你不能只调用它。
    【解决方案3】:

    这将为您生成一个 GUID:SELECT NEWID()

    可以在此处找到示例:http://msdn.microsoft.com/en-us/library/ms190348.aspx

    【讨论】:

      【解决方案4】:

      从您提出问题的方式来看,我的猜测是您将 GUID 存储在数据库中的文本(例如 VARCHAR)字段中 - 如果是这种情况,那么您应该改用 uniqueidentifier在这种情况下,您可以使用NEWID() SQL 函数来生成新的 GUID。

      有关如何在 SQL Server 数据库中存储 GUID 的更多详细信息,请参阅 C# guid and SQL uniqueidentifier

      【讨论】:

        【解决方案5】:

        你可以使用NEWID()

        但是,像这样生成的索引 guid 存在问题。相反,您应该使用comb algorithm:

        CAST(CAST(NEWID() AS BINARY(10)) +
            CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)
        

        确保将这些存储在 UNIQUEIDENTIFIER 类型的列中,而不是将它们转换为 NVARCHAR 或任何类型的列。

        【讨论】:

          【解决方案6】:

          您可以使用NEWSEQUENTIALID 来获得更好的索引支持,但缺点是您只能将此函数用作列的默认值表达式。

          你可以使用类似的东西:

          INSERT INTO MyTABLE (...) OUTPUT inserted.GUIDCOLUMN INTO @tableVar VALUES (...)
          

          访问新生成的顺序ID。

          【讨论】: