C# MSQL查询获取整数十六进制值的Int值
背景 为了给大家一个背景知识,我已经介绍了我为什么要这么做的一些背景知识: 我有一个表'cp',它有一个[id]字段,它是每次注册的标识符我意识到这将从部署的解决方案移动到基于云的解决方案,因此多个帐户将访问相同的对象,最好是它们都从1开始,而不是使用id字段,我创建了一个名为label的int字段,将在与帐户id结合以查找每个帐户的唯一记录C# MSQL查询获取整数十六进制值的Int值,c#,sql,sql-server,C#,Sql,Sql Server,背景 为了给大家一个背景知识,我已经介绍了我为什么要这么做的一些背景知识: 我有一个表'cp',它有一个[id]字段,它是每次注册的标识符我意识到这将从部署的解决方案移动到基于云的解决方案,因此多个帐户将访问相同的对象,最好是它们都从1开始,而不是使用id字段,我创建了一个名为label的int字段,将在与帐户id结合以查找每个帐户的唯一记录 field | type ________________________ id | int label
field | type
________________________
id | int
label | int
account_id | int
当注册在屏幕上打印出来时,我希望它们显示为5位十六进制数字,我可以简单地在c代码中执行以下操作
但是,在添加新标签字段之前,数据库中的现有条目存在问题。
我发现了几个类似的问题,但没有回答我的问题
SELECT CONVERT(INT, '0x' + id) FROM cp;
通过执行以下操作,我可以在C#中获得正确的效果
int.Parse(value.ToString(),System.Globalization.NumberStyles.HexNumber).ToString()
更新:我已经为我的用例找到了这个问题的解决方案,但出现了一些混淆,我将在数据库中进行所有转换,我通过上面的SELECT语句进行假设。为了澄清这是转换现有记录的一次性事件。请注意,下面的语句不起作用,而是叠加flow不允许我编辑原始语句,因为更改少于15个字符
UPDATE [dbname].[dbo].[cp] set [Label] = CONVERT(INT, '0x' + id);
找到了答案,它不漂亮,但它解决了我的问题,所以我想我会与你分享。如果有人有一个更简单的解决方案,这将是伟大的,但在同一时间,我们走 创建一个MSQL函数
CREATE FUNCTION ConvertFromBase
(
@value AS VARCHAR(MAX),
@base AS BIGINT
) RETURNS BIGINT AS BEGIN
-- just some variables
DECLARE @characters CHAR(36),
@result BIGINT,
@index SMALLINT;
-- initialize our charater set, our result, and the index
SELECT @characters = '0123456789abcdefghijklmnopqrstuvwxyz',
@result = 0,
@index = 0;
-- make sure we can make the base conversion. there can't
-- be a base 1, but you could support greater than base 36
-- if you add characters to the @charater string
IF @base < 2 OR @base > 36 RETURN NULL;
-- while we have characters to convert, convert them and
-- prepend them to the result. we start on the far right
-- and move to the left until we run out of digits. the
-- conversion is the standard (base ^ index) * digit
WHILE @index < LEN(@value)
SELECT @result = @result + POWER(@base, @index) *
(CHARINDEX
(SUBSTRING(@value, LEN(@value) - @index, 1)
, @characters) - 1
),
@index = @index + 1;
-- return the result
RETURN @result;
END
这个解决方案是在中发现的。你不应该用SQL进行数字格式化。让整数作为整数从数据库中出来,并在你的表示层中进行格式化。你完全没有提到表示层是什么,所以不可能再多说了,但如果你这样做,当你的老板过来并表示有些用户希望看到十六进制,有些用户希望看到base-10。表示层是c#,正如我在问题中所指出的,我不是全面使用SQL进行十六进制转换,我只是想要一个转换器来处理现有的记录,然后使用SQL查询来完成这项工作似乎是有意义的业务层可以处理任何新记录。而不是将代码构建到业务层中只供一次使用。此外,转换的原因是,可以显示的字符数为5,小数位数限制为100000条记录,这对于我们的情况来说太低了,十六进制数可以有1048576条记录因此,不会有客户需要查看base-10值的情况,不幸的是,由于字符混淆O=>0和l=>1,我不能使用base-36,因此我只能使用HEX atm,但至少现在我已经给客户提供了10倍的可能记录数,这在目前的规范范围内。
CREATE FUNCTION ConvertFromBase
(
@value AS VARCHAR(MAX),
@base AS BIGINT
) RETURNS BIGINT AS BEGIN
-- just some variables
DECLARE @characters CHAR(36),
@result BIGINT,
@index SMALLINT;
-- initialize our charater set, our result, and the index
SELECT @characters = '0123456789abcdefghijklmnopqrstuvwxyz',
@result = 0,
@index = 0;
-- make sure we can make the base conversion. there can't
-- be a base 1, but you could support greater than base 36
-- if you add characters to the @charater string
IF @base < 2 OR @base > 36 RETURN NULL;
-- while we have characters to convert, convert them and
-- prepend them to the result. we start on the far right
-- and move to the left until we run out of digits. the
-- conversion is the standard (base ^ index) * digit
WHILE @index < LEN(@value)
SELECT @result = @result + POWER(@base, @index) *
(CHARINDEX
(SUBSTRING(@value, LEN(@value) - @index, 1)
, @characters) - 1
),
@index = @index + 1;
-- return the result
RETURN @result;
END
UPDATE [cp] SET label = dbo.ConvertFromBase(id,16);