IF EXISTS(SELECT TOP 1 1 FROM [sys].[objects] WHERE object_id =OBJECT_ID(N'[dbo].[f_NBaseToDecimal]') AND type IN(N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[f_NBaseToDecimal]
GO
/*
2021-10-13 YiCong.Zhuang Create N 进制转 10 进制
*/
CREATE FUNCTION [dbo].[f_NBaseToDecimal] (
@NBaseCode VARCHAR(100) /* N 进制码,如 16 进制为 '0123456789ABCDEF',34 进制为 '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ'。也可以自定义,如 'ABC' */
, @NBaseValue VARCHAR(100) /* N 进制值 */
)
RETURNS BIGINT
AS
BEGIN
DECLARE
@Return BIGINT = 0
, @BaseCodeLen BIGINT = LEN(@NBaseCode) /* 进制码长度,即计算出是多少进制 */ /* 这里类型也要用 BIGINT,因为 POWER 返回值的类型与第一个参数类型相同 */
, @idx INT = 0 /* 第 i 位 N 进制值 */
, @BaseCharIdx INT /* 字符在 N 进制中对应的 10 进制值,如 A 在 16 进制中是 10 */
, @BaseValueLen INT = LEN(@NBaseValue) /* N 进制值长度,先计算出来,循环判断时直接使用即可 */
/*
如 16 进制的 75D 转 10 进制的计算过程:
1. 处理数据时从后往前处理,所以先将 16 进制值反转,得 D57
2. 第 1 位 D 在 16 进制中对应的 10 进制值是 13
3. 13 乘以 16 的 1 -1 次方,此值就是 00D 对应的 10 进制值 13
4. 第 2 位 5 在 16 进制中对应的 10 进制值是 5
5. 5 乘以 16 的 2 -1 次方,此值就是 050 对应的 10 进制值 80
6. 第 3 位 7 在 16 进制中对应的 10 进制值是 7
7. 7 乘以 16 的 3 -1 次方,此值就是 700 对应的 10 进制值 1792
8. 把上面得到的各位 10 进制值加起来,便是 16 进制值对应的 10 进制值了:13 +80 +1792 = 1885
*/
SQL Server 进制转换函数
最新推荐文章于 2023-04-09 18:18:55 发布