还原字母数字标识

时间:2016-02-24 14:42:49

标签: sql-server identity alphanumeric

我看到这个问题已被多次询问并取得了相当不错的结果,但是这个问题的不同之处在于我们想要在添加了alpha编号ID之后恢复为正常的自动增量ID。

我们有3个数据库,最终都会合并到一个数据库中。为了使我们的系统保持兼容,我们需要ID来保持合并。到目前为止,我们已经设法以字母数字方式组合数据,其中我们将记录ID与数据库源前缀,例如来自DBAA的ID现在是AA ##,而DBBB现在是BB ##。

现在的问题是,是否可以将varchar ID列恢复为自动增量整数,而无需在后端添加更多列或创建函数?我们的想法是新合并数据库中的下一个条目将高于3个DB中的最高条目,因此如果AA10最高,那么下一个条目将是11.(后端没有前缀且没有函数)< / p>

CREATE TABLE tableTest
(
    colID varchar(50) PRIMARY KEY,
    [desc] varchar(10) NOT NULL
)   
ALTER TABLE tableTest ALTER COLUMN colID int NOT NULL IDENTITY(1,1)
当然,你可以想象这不起作用。最后,我只是想知道如果没有后端函数或其他列,这是否可行。

1 个答案:

答案 0 :(得分:1)

所以,总结肖恩和我的评论 - 答案是否定的 出于多种原因,这是不可能的。

您可以操纵该列中的数据来创建唯一的数值(即提供您的值是唯一的,就像现在一样) - 这样的事情可以解决问题:

UPDATE tableTest
    SET colId = REPLACE(REPLACE(REPLACE(colId, 'AA', ''), 'BB', ''), 'CC', '') + 
    CASE 
        WHEN colId LIKE 'AA%' THEN '1'
        WHEN colId LIKE 'BB%' THEN '2'
        WHEN colId LIKE 'CC%' THEN '3'
    END

这样,您当前的数字部分保持最重要的数字 - 因此,如果您的表格包含的值为 . AA1, BB5, CC7, AA30, BB12,它现在将包含以下值:
. 11, 52, 73, 301, 122 - 如您所见,“订单”已保留。

另一个选项是添加新的标识列,删除当前的colID列,并将标识列重命名为colID
这可以通过使用ssms的表设计器或使用sp_rename来实现 请注意,如果您不使用表设计器,则必须首先删除主键约束,然后才能删除列。