我正在创建唯一的客户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与我们目前拥有的不同“因此用户不知道我们实际拥有多少账户。“
ABS(CHECKSUM(NEWID()))
的正确数据类型吗?答案 0 :(得分:2)
片刻之后,请忘记您必须尝试插入链接服务器的问题(尽管从您的代码中可以明显看出Customers
必须是同义词,或者您将语句缩小了)。
问问自己:为什么你会使用随机数来表示唯一性?随机和独特可能看似相似的概念,但它们不是。
我也发现缺少错误处理(同样,这可能只是因为你愚弄了代码以“帮助”我们)。最终你会得到重复。您可能需要阅读this tip和this blog post。基本上,当您插入越来越多的“唯一”值时,您获得碰撞的可能性会增加。因此,我认为您应该退一步并重新考虑问题,而不是解决您的解决方案的问题。
为什么使用随机数而不是简单的概念 - 至少在默认情况下 - 以更加可预测的方式帮助确保唯一性,例如IDENTITY
或SEQUENCE
?是为了防止人们猜测下一个值,还是能够确定在一段时间内生成多少个值?如果是这样,那么使用一堆随机值预填充一个表,并在需要时将一个从堆栈中拉出as I described here。如果这不是关键问题,那么请停止背弃,只使用现有的方法来生成唯一的 - 而不是随机的数字。
答案 1 :(得分:1)
再次生成唯一ID的错误选择
但是,据说这不会引发错误,所以我认为其他事情正在发生
declare @id int
set @id = ABS(CHECKSUM(NEWID()))
print @id
您不希望用户知道有多少帐户和custID是身份的更新应该在原始问题陈述中。
答案 2 :(得分:1)
更新是在一个Big @ $$表格上完成的...由于我的工资等级以上的原因,我们希望新的uid与我们目前拥有的不同“因此用户不知道我们实际拥有多少账户。“
选择一个常量并将其与现有标识符进行异或,以获得一些有点混淆的数字。再次对它进行XOR以获得原始标识符。