先把整个代码粘上来。
1
CREATE FUNCTION [dbo].[ufn_HecToDec]2
(3
@Hec varchar(50)4
)5
RETURNS int6
AS7
BEGIN8
DECLARE @Dec int,@Count int,@BigBit int,@StrOne int9

10
SET @BigBit = 011
SET @Count = 112
SET @Dec = 013
14
--Get the number of hexadecimal digits 15
WHILE @BigBit < LEN(@Hec)16
BEGIN17
SET @StrOne = ASCII(LOWER(SUBSTRING(@Hec,@Count,1)))18
IF (@StrOne >= 48 AND @StrOne <= 57) 19
OR20
(@StrOne >= 97 AND @StrOne <= 102)21
BEGIN22
SET @BigBit = @BigBit + 123
SET @Count = @Count + 124
CONTINUE25
END26
ELSE27
BREAK28
END 29
30
SET @Count = 131

32
WHILE @BigBit > 033
BEGIN34
SET @StrOne =ASCII(LOWER(SUBSTRING(@Hec,@Count,1)))35
SELECT @Dec = @Dec +36
CAST(37
CASE WHEN @StrOne >=48 AND @StrOne <= 57 THEN @StrOne-4838
WHEN @StrOne = 97 THEN 1039
WHEN @StrOne = 98 THEN 1140
WHEN @StrOne = 99 THEN 1241
WHEN @StrOne = 100 THEN 1342
WHEN @StrOne = 101 THEN 1443
WHEN @StrOne = 102 THEN 1544
END45
AS INT)*POWER(16,@BigBit-1)46
SET @Count = @Count + 147
SET @BigBit = @BigBit - 148
END49

50
RETURN @Dec51
END52
GO分段说一下
1. 先说一下变量的含义
1
DECLARE @Dec int,@Count int,@BigBit int,@StrOne int2
--@Dec: 存储最终计算出来的十进制数3
--@Count:获取单个字符的开始位置 (用于分析字符串)4
--@BigBit:十六进制数的最高位5
--@StrOne:存储获取的单个字符 (用于分析是否为合法的十六进制 & 十六进制具体值)2. 获取十六进制数的位数
1
WHILE @BigBit < LEN(@Hec)2
BEGIN3
SET @StrOne = ASCII(LOWER(SUBSTRING(@Hec,@Count,1)))--获取单个字符,并转为ASCII值4
IF (@StrOne >= 48 AND @StrOne <= 57) --判断是否为合法的十六进制数 5
OR -- (48-57: 0-9)6
(@StrOne >= 97 AND @StrOne <= 102) -- (97-102: a-f)7
BEGIN8
SET @BigBit = @BigBit + 1 --如果是合法的十六进数,对十六进制数的位数进行累加9
SET @Count = @Count + 110
CONTINUE11
END12
ELSE13
BREAK --遇到不合法的十六进制数,退出循环14
END 3. 计算十六制数
1
WHILE @BigBit > 0 --以合法的十六进制数的位数做为循环条件2
BEGIN3
SET @StrOne =ASCII(LOWER(SUBSTRING(@Hec,@Count,1)))--获取单个的十六进制数4
SELECT @Dec = @Dec +5
CAST(6
CASE WHEN @StrOne >=48 AND @StrOne <= 57 THEN @StrOne-487
WHEN @StrOne = 97 THEN 10 --a = 108
WHEN @StrOne = 98 THEN 11 --b = 119
WHEN @StrOne = 99 THEN 12 --c = 1210
WHEN @StrOne = 100 THEN 13 --d = 1311
WHEN @StrOne = 101 THEN 14 --e = 1412
WHEN @StrOne = 102 THEN 15 --f = 1513
END14
AS INT)*POWER(16,@BigBit-1) --单个的十六进制数*16的位数立方 (累加)15
SET @Count = @Count + 116
SET @BigBit = @BigBit - 117
END传入的十六进制数的位数不受限制(但你要考虑数据类型的范围)。
有不对的地方请大家指教。