繁体   English   中英

如果为null,如何在sql中生成uniqueidentifier

[英]How to generate a uniqueidentifier in sql if null

我试图将一列添加到现有SQL表的uniqueidentifier类型。 该列不能为空,当然也不能唯一。 我尝试了这段代码:

ALTER TABLE ScheduleJobs ADD CurrentInstanceID uniqueidentifier not null

其次是:

ALTER TABLE ScheduleJobs ADD CONSTRAINT DF_CurrentInstanceID DEFAULT newsequentialid() FOR CurrentInstanceID

但是,当我从C#创建新记录时,uniqueidentifier总是全零(大概为null。)我可以在C#中创建GUID,并在创建新记录时将其传递给sql,但效果很好,但我担心可以创建一个重复的GUID。 根据我的阅读,这似乎是一种极为罕见的情况,但总是存在着任何潜在的错误浮出水面的坏习惯。 请注意,该字段将不是表的PK。 为了教育起见,欢迎提出建议和意见。

我在MS SQL SERVER 2008中使用C#4.0框架

很抱歉造成您的延迟,但是我很高兴地说我已经解决了这个问题。 感谢大家的大力支持。 虽然没有人能完全打定主意(并且有一些非常好的建议),但埃尔多格提出了Entity Framework的意见不佳。 多亏了他,我才用Googled Entity Framework + GUID找到了解决方案。

本文逐步解决了该问题,并对问题,解决方案以及解决此问题的步骤进行了很好的解释。 我将注意到,我决定逐步进行并测试一个步骤,而不必执行最后一步。 这使我相信,部分问题可能已在更高版本的实体框架中得到解决。

我只是在设计视图(不是xml)中拉出edmx文件,并将StoreGeneratedPattern属性设置为“ Identity”。

再次感谢您的帮助和建议。 你真是棒极了。

创建记录时,您的C#代码是否尝试传递CurrentInstanceID? 如果是这样,您可以从INSERT语句中删除该列吗?

我们使用数字主键来实现。 我们的C#代码为记录上的CRUD操作调用存储过程。 C#代码在客户端生成一个否定密钥供其自己使用。 准备好创建记录时,它将把此密钥传递给存储过程。

proc会忽略此键并插入其余数据。 proc的输出是SQL分配给记录的实际键。 最后,C#代码将新密钥合并到现有数据中。

我不会为此使用GUID。 GUID在Windows的许多操作中都使用过,因此,它不是一个仅在您的应用程序中 唯一的标识符 ,而是一个在操作系统中唯一标识符 除非这对您有帮助,否则我不会使用。

您可以使用增量值,例如简单的uint 如果表中已有数据,则可以编写一个脚本,用新列的增量值填充现有行,并在执行该脚本后将唯一约束添加到列中。

在原始的“创建”表或“更改”表中,使用如下所示的内容

create table ScheduleJobs (keyval int, id2 uniqueidentifier not null default newsequentialid())

然后不要引用插入内容中的列,而是将添加一个新的GUID值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM