从两个值创建唯一编号;比特转移?

时间:2013-09-10 16:37:20

标签: sql-server sql-server-2005

我有一个包含ID和区域设置的表。使用不同的区域设置可以多次列出相同的ID:

ID      Locale
123456  EN_US
234567  EN_US
234567  EN_CA
345678  EN_US

我需要为每条记录以数字ID(整数)的形式创建唯一标识符,同时保持对原始组件进行反向工程的能力。

我认为位移可能有用:为每个语言环境分配一个数值,但我不太确定如何实现。以前有人遇到过这个挑战吗?此外,我有75个语言环境,所以我不确定这是否会导致位移的问题。

最后,我正在使用SQL Server与Teradata的链接服务器连接(这是我的数据源)。我不认为Teradata支持开箱即用,所以我假设我必须在MSSQL中这样做。

谢谢。

2 个答案:

答案 0 :(得分:3)

您可以创建复合数字键,将75个唯一值映射到数字键的最后2位数。您可以使用简单模数100算法或仅使用子字符串解析组件。如果您将超过100个值,请使用3位数字。总数为9位将适合int,10-18将适合bigint。

答案 1 :(得分:0)

将234567-EN_US转换为整数很容易。只需在连接的字符串值上使用CHECKSUM。然而,它不可逆转。

然而,您可以将此CHECKSUM值存储在原始表中,然后使用它从您将要存储整数的任何表中回溯。

另一种解决方案是为每个语言环境分配一个Integer值(如Marc B建议的那样)。调用X.然后将您现有的整数ID(234567)称为Y.您的最终键将是(X * 1,000,000)+ Y.然后您可以反转公式以获取值。当然,如果您现有的整数ID远低于1,000,000,并且您的最终整数可以是BigInt,那么这只会起作用。