我正在构建处理大部分数据的Web应用程序的后端,而前端开发人员正在寻找用于连接数据的稳定整数代码。
他们试图使用的当前整数值是代理键,它们将在未来发生变化,从而导致许多问题。 每个表都有一个字母数字代码,我正在寻找一种方法,我可以将其转换为稳定的int。
EG转换代码' AAAA'进入1111或MMMM成13131313
有人能告诉我这是否可能。
谢谢,
答案 0 :(得分:5)
McNets的评论似乎是一种非常好的方法......
如果你可以确定,你有
您可以将字符串转换为VARBINARY(4)
并将其转换为INT
:
DECLARE @dummy TABLE(StrangeCode VARCHAR(10));
INSERT INTO @dummy VALUES
('AAAA'),('MMMM'),('ACAC'),('CDEF'),('ABCD');
SELECT CAST(CAST(StrangeCode AS VARBINARY(4)) AS INT)
FROM @dummy;
结果
1094795585
1296911693
1094926659
1128547654
1094861636
如果您需要更大的号码,则可能会达到BIGINT
答案 1 :(得分:1)
一种方法是像这样使用CTE:
;with tt(i, c1, c2) as (
select 1, c, replace(c,char(65), 1)
from yourTable
union all
select i+1, c1, c2= replace(c2,char(65+i), i+1)
from tt
where i < 26
)
select c1, cast(c2 as bigint) num
from tt
where i = 26;
答案 2 :(得分:0)
正如McNets建议的那样,创建第二个表:
create table IntCodes (id INT IDENTITY(1,1), UserCode VARCHAR(50) NOT NULL)
insert into IntCodes (UserCode)
select distinct UserCode
from MyTable
您需要一个触发器:
create trigger Trg_UserCode
on MyTable
after insert as
begin
insert into IntCodes (UserCode)
select i1.UserCode
from INSERTED i1
where i1.UserCode not in (select ic.Usercode from IntCodes ic)
end
现在,作为查询的一部分:
select t1.*, t2.id as IntCode
from MyTable t1
inner join IntCodes t2
on t1.UserCode = t2.UserCode
这意味着您不必担心更新现有列