将字母转换为数字

时间:2017-01-23 11:20:13

标签: sql sql-server sql-server-2012

我正在构建处理大部分数据的Web应用程序的后端,而前端开发人员正在寻找用于连接数据的稳定整数代码。

他们试图使用的当前整数值是代理键,它们将在未来发生变化,从而导致许多问题。 每个表都有一个字母数字代码,我正在寻找一种方法,我可以将其转换为稳定的int。

EG转换代码' AAAA'进入1111或MMMM成13131313

有人能告诉我这是否可能。

谢谢,

3 个答案:

答案 0 :(得分:5)

McNets的评论似乎是一种非常好的方法......

如果你可以确定,你有

  • 纯ASCII字符
  • 不超过4个字母

您可以将字符串转换为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

这意味着您不必担心更新现有列