我有一个通过C#代码隐藏生成的GUID的ASP.NET应用程序。这些GUID通过以下方式生成:的GUID在SQL Server
Guid id = Guid.NewGuid();
此GUID稍后存储在SQL Server 2008数据库中。我也有一个存储过程将更新该记录。我想在存储过程中生成与ASP.NET中生成的格式相同格式的GUID。
有人可以告诉我如何做到这一点?
谢谢!
我有一个通过C#代码隐藏生成的GUID的ASP.NET应用程序。这些GUID通过以下方式生成:的GUID在SQL Server
Guid id = Guid.NewGuid();
此GUID稍后存储在SQL Server 2008数据库中。我也有一个存储过程将更新该记录。我想在存储过程中生成与ASP.NET中生成的格式相同格式的GUID。
有人可以告诉我如何做到这一点?
谢谢!
如果这是针对聚集索引(通常是主键),我强烈建议使用NEWSEQUENTIALID()
(SQL Server 2005),因为在这种情况下,NEWID()
会创建一个碎片索引,而且是真正的随机数。
'newsequentialid()'只能被指定为列上的默认约束 - 您不能直接调用它。 –
@Jesse非常好的建议 – Behnam
使用NEWID()
方法
DECLARE @ID uniqueidentifier
SET @ID = NEWID()
,这将产生一个GUID为您:SELECT NEWID()
例子可以在这里找到:http://msdn.microsoft.com/en-us/library/ms190348.aspx
你可以使用NEWID()
。
但是,也有与索引GUID的问题是这样产生的。相反,你应该使用comb algorithm:
CAST(CAST(NEWID() AS BINARY(10)) +
CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)
确保您在UNIQUEIDENTIFIER
类型的列存储这些,而不是将它们转换为NVARCHAR
或诸如此类的事。
我的猜测来自您提出问题的方式,即您将GUID存储在数据库中的文本(例如VARCHAR
)字段中 - 如果是这种情况,则应该使用uniqueidentifier
类型,其中您可以使用NEWID()
SQL函数来生成新的GUID。
关于如何的GUID存储在SQL Server数据库详见C# guid and SQL uniqueidentifier。
可以使用NEWSEQUENTIALID更好的索引支持,但缺点是,你可以使用这个功能只为您的列的默认值表达式。
您可以使用类似:
INSERT INTO MyTABLE (...) OUTPUT inserted.GUIDCOLUMN INTO @tableVar VALUES (...)
访问新生成的序列号。
你是什么意思“在相同的格式”是什么意思? GUID是二进制的 - 一系列16个字节。 –