MSQL Query获取Integer的十六进制值的Int值
本文关键字:十六进制 Int Integer Query 获取 MSQL | 更新日期: 2023-09-27 18:19:51
背景
只是给你一个背景,我已经包括了一个小背景,我为什么要这样做:
我有一个表"cp",它有一个[id]字段,这是每个注册的标识符。我意识到这将从部署的解决方案移动到基于云的解决方案,因此多个帐户将访问相同的对象,最好它们都从1开始,所以我创建了一个名为label的int字段,该字段将与使用帐户id来查找每个帐户的唯一记录。
field | type
________________________
id | int
label | int
account_id | int
当注册在屏幕上打印出来时,我希望它们显示为5位十六进制数字,我可以在c#代码中简单地执行以下操作
value.ToString("X")
然而,在添加新的标签字段之前,数据库中的现有条目存在问题。我发现了几个类似的问题,但没有回答我的问题
- 将段落转换为十六进制符号,然后再转换为字符串
- 在SQL中将字符串转换为HEX
- 将整数转换为十六进制,将十六进制转换为整数
问题
我有id(1,2,3,----,11,12,13,----等)值为1-9的字段,可以简单地复制为值。ToString("X")对这些值没有任何作用,但是,如果我只是复制了值11,它将返回"B",正确地说是11的十六进制值,但是我希望它返回"11",所以我需要一个SQL脚本,它将转换11=>17(这是0x11的十六进制),这样当应用程序读取它时,它将把值11输出到屏幕上。
这种情况只会在转换现有id时发生一次,这就是为什么我希望SQL脚本在一批中完成所有操作,而不是将其构建到应用程序中。
我想要的是下面这样的东西,这样它就假设中的值是十六进制值,并将其转换回Int.
SELECT CONVERT(INT, '0x' + id) FROM cp;
我可以通过以下在C#中获得正确的效果
int.Parse(value.ToString(),System.Globalization.NumberStyles.HexNumber).ToString()
UPDATE:我已经为我的用例找到了这个问题的解决方案,但根据上面的SELECT语句,我认为我将在数据库中进行所有转换,这引起了一些困惑。澄清这是转换现有记录的一次性事件。请注意,下面的语句不起作用,但stackoverflow不会让我编辑原始语句,因为更改少于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
然后简单地执行以下查询
UPDATE [cp] SET label = dbo.ConvertFromBase(id,16);
此解决方案是在中发现的http://dpatrickcaldwell.blogspot.com/2009/05/converting-hexadecimal-or-binary-to.html
您不应该在SQL中进行数字格式化。让int作为int从数据库中出来,并在表示层中对其进行格式化。你完全没有提到表示层是什么,所以不可能再多说了,但如果你这样做了,当你的老板走过来说有些用户想看到十六进制,有些用户想看10进制时,你就不知所措了。