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 Query获取Integer的十六进制值的Int值

找到了答案,它不漂亮,但它解决了我的问题,所以我想我会和你分享它。如果有人有一个更简单的解决方案,那就太好了,但与此同时,我们开始了。

创建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进制时,你就不知所措了。