INT是ABS的正确数据类型(CHECKSUM(NEWID()))?

时间:2013-11-06 20:31:50

标签: sql sql-server tsql

我正在创建唯一的客户ID,这是外部使用的替代ID。

在为我的唯一ID添加数据类型为INT的新列“cust_uid”的过程中,

当我对这个新专栏进行INSERT时:

Insert Into Customers(cust_uid)
Select ABS(CHECKSUM(NEWID()))

我收到错误:

无法创建可接受的游标。链接服务器“SHQ2IIS1”的OLE DB提供程序“SQLNCLI”返回消息“多步OLE DB操作生成错误。检查每个OLE DB状态值,如果可用。没有工作。

我检查了两个表上的所有数据类型,并且唯一已更改的内容是两个表中的新列。

更新是在一个Big @ $$表格上完成的...由于我的工资等级以上的原因,我们希望新的uid与我们目前拥有的不同“因此用户不知道我们实际拥有多少账户。“

  • INT是ABS(CHECKSUM(NEWID()))的正确数据类型吗?

3 个答案:

答案 0 :(得分:2)

片刻之后,请忘记您必须尝试插入链接服务器的问题(尽管从您的代码中可以明显看出Customers必须是同义词,或者您将语句缩小了)。

问问自己:为什么你会使用随机数来表示唯一性?随机和独特可能看似相似的概念,但它们不是。

我也发现缺少错误处理(同样,这可能只是因为你愚弄了代码以“帮助”我们)。最终你会得到重复。您可能需要阅读this tipthis blog post。基本上,当您插入越来越多的“唯一”值时,您获得碰撞的可能性会增加。因此,我认为您应该退一步并重新考虑问题,而不是解决您的解决方案的问题。

为什么使用随机数而不是简单的概念 - 至少在默认情况下 - 以更加可预测的方式帮助确保唯一性,例如IDENTITYSEQUENCE?是为了防止人们猜测下一个值,还是能够确定在一段时间内生成多少个值?如果是这样,那么使用一堆随机值预填充一个表,并在需要时将一个从堆栈中拉出as I described here。如果这不是关键问题,那么请停止背弃,只使用现有的方法来生成唯一的 - 而不是随机的数字。

答案 1 :(得分:1)

再次生成唯一ID的错误选择

但是,据说这不会引发错误,所以我认为其他事情正在发生

declare @id int 
set @id = ABS(CHECKSUM(NEWID())) 
print @id 

您不希望用户知道有多少帐户和custID是身份的更新应该在原始问题陈述中。

答案 2 :(得分:1)

  

更新是在一个Big @ $$表格上完成的...由于我的工资等级以上的原因,我们希望新的uid与我们目前拥有的不同“因此用户不知道我们实际拥有多少账户。“

选择一个常量并将其与现有标识符进行异或,以获得一些有点混淆的数字。再次对它进行XOR以获得原始标识符。