2017-01-23 164 views
1

我正在構建處理大部分數據的Web應用程序的後端,前端開發人員正在尋找穩定的整數代碼以用於連接數據。將字母轉換爲數字

他們試圖使用的當前整數值是代理鍵,它將會改變將會導致許多問題。 每個表都有一個字母數字代碼,我正在尋找一種方法可以將其轉換爲穩定的int。

EG轉換代碼「AAAA」到1111或MMMM到13131313

誰能告訴我,如果這是在所有可能的。

感謝,

+3

,你如何期望將'ACAC' - > 1313與'MM' - > 1313區分開來? –

+3

在臨時表中選擇獨立代碼,爲每個代碼分配一個int值,更新第一個表 – McNets

+0

這些代碼的最大寬度是多少? – Shnugo

回答

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 

這意味着你和我不必擔心更新現有列

2

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

0

一種方法是使用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;