0

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

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

当我在这个新列中插入时:

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

我收到一个错误:

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

我检查了两个表上的所有数据类型,唯一改变的是两个表中的新列。

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

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

3 回答 3

2

暂时忘记您的问题,即必须尝试插入链接服务器的问题(尽管从您的代码中看不出Customers必须是同义词或者您将语句简化了)。

问问自己:为什么要使用随机数来实现唯一性?随机和独特可能看起来像是相似的概念,但事实并非如此。

我还看到缺乏错误处理(同样,这可能只是您简化了代码以“帮助”我们)。最终你会得到重复。您可能想阅读此技巧此博客文章。本质上,当您插入越来越多的“唯一”值时,发生碰撞的可能性就会增加。因此,与其用你的解决方案来解决问题,我认为你应该退后一步,重新考虑这个问题。

为什么你使用随机数而不是更简单的概念——至少在默认情况下——以更可预测的方式帮助确保唯一性,比如IDENTITYor SEQUENCE?是防止人们猜测下一个值,还是能够确定您在一段时间内生成了多少值?如果是这样,那么用一堆随机值预先填充一个表,并在需要时从堆栈中拉出一个,正如我在此处描述的那样。如果这不是关键问题,那么不要再折腾了,只需使用现有的方法来生成唯一的——而不是随机的——数字。

于 2013-11-06T20:45:22.530 回答
1

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

但是话虽如此,这不会引发错误,所以我认为还有其他事情发生

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

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

于 2013-11-06T20:50:23.307 回答
1

更新是在一张 @$$ 大表上完成的……出于高于我的工资等级的原因,我们希望拥有与我们目前拥有的不同的新 uid,“所以用户不知道有多少帐户我们实际上有。”

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

于 2013-11-06T21:49:54.807 回答