【问题标题】:SQL Server 2008 R2: How to identify and update hexadecimal valueSQL Server 2008 R2:如何识别和更新十六进制值
【发布时间】:2015-10-23 06:29:06
【问题描述】:

我有一个名为Hexa_Table 的表格,它只包含一列,即val

表格Hexa_Table

CREATE TABLE Hexa_Table
(
 val VARCHAR(50)
);

插入

INSERT INTO Hexa_Table VALUES('123456789101213');
INSERT INTO Hexa_Table VALUES('414F2D53594F545641');
INSERT INTO Hexa_Table VALUES('1234F6789A1213G');
INSERT INTO Hexa_Table VALUES('414F2D363530303035');
INSERT INTO Hexa_Table VALUES('12345678910');

注意:现在我只想更新那些为Hexadecimal 的值并想将其更新为String,为此我需要确定哪些是Hexadecimal 中的值表。

例如,我有记录号 2,即 414F2D53594F545641,如果您转换它将得到 AO-SYOTVA。在第 4 条记录中,我有 414F2D363530303035,如果你转换它将得到 AO-650005

使用转换:This

问题
1、如何识别表中的十六进制值?
2. 如何将十六进制值更新为字符串?

【问题讨论】:

  • 这些值已经在字符串中。 “如何将十六进制值更新为字符串?”是什么意思?
  • @ughai,我知道我正在使用varchar 但我在该列中得到了十六进制值。那么如何将其更新为字符串?

标签: sql-server string sql-server-2008-r2 hex


【解决方案1】:

您可以将CONVERT1 样式一起使用。在你的场景中是这样的。

您可以使用过滤器NOT LIKE '%[^0-9a-f]%' 来匹配精确的十六进制模式和LEN(val) %2 = 0 来检查它是否具有convert 所需的确切字节数

SELECT  val,
    CAST(CONVERT(varbinary(4), '0x' + val, 1) As VARCHAR(100)) as charstring,
    CONVERT(varbinary(4), '0x' + val, 1) as HexVal
FROM Hexa_Table
WHERE val NOT LIKE '%[^0-9a-f]%'
AND LEN(val) %2 = 0;

输出:

val charstring  HexVal
414F2D53594F545641  AO-S    0x414F2D53
414F2D363530303035  AO-6    0x414F2D36

参考

How can I convert a varchar with hexadecimal value to int?

MSDN Convert

【讨论】:

  • 这个真的不错+1
  • @MartinSmith 的所有赞誉,其answers 之一的cmets 建议使用CONVERT 风格。
【解决方案2】:

您可以使用以下方法在表中查找十六进制值:

like '%' + CHAR(0x00) +'%'

但是,在您展示的示例中,这些值已经存储为字符串,所以我不确定您将值转换为字符串是什么意思。

附带说明:

如果您想知道如何将十六进制转换为 varchar,那么您需要像这样使用 CONVERT":

CONVERT(VARCHAR(MAX), 0x48656c70)

【讨论】:

  • @MAK:- 我不确定,但我认为使用传统方式是不可能的。我想到的一件事是创建一个数据类型为 VARBINARY 的新列,然后将 varchar 列值复制到其中。然后,您可以将该列的所有值转换为 varchar。最后,您可以使用一些正则表达式(允许的字符,如 abcd..and dash-)忽略/删除列,并保留其余的。
  • @MAK:(但请相信我,这是一种非常非常糟糕的方法,因此如果对您没有帮助,您可以忽略
  • 非常感谢 Rahul 抽出宝贵时间。我从 ughai 那里得到了解决方案。
【解决方案3】:

要找出十六进制值,您可以通过以下方式:

select val
from Hexa_Table
where val like '%' + CHAR(0x00) +'%'

它已经存储为VARCHAR,你想更新什么以及如何更新?

【讨论】:

  • 例如,我有记录号 2,即 414F2D53594F545641,如果您转换它将得到 AO-SYOTVA。在第四条记录中,我有414F2D363530303035,如果你转换它将得到AO-650005
  • 您可以通过以下方式进行操作:select CONVERT(VARCHAR(MAX), 0x414F2D53594F545641)
  • 如何将0x 分配给值?你是怎么知道哪个是十六进制的?
  • @MAK:- 在这种情况下,由于您已将值存储为 varchar,因此无法确定您的哪个值实际上代表十六进制值
  • @RahulTripathi,是的!这是我面临的问题。因为我有一个 varchar 数据类型的列,并且其中的值是十六进制的,所以我需要更新它。
【解决方案4】:

试试这个代码:

BEGIN TRAN

SELECT * FROM Hexa_Table 
WHERE val = @value_insert

IF (@@ROWCOUNT = 0)
    INSERT Hexa_Table
    SELECT CONVERT(VARCHAR(50), @value_insert)

COMMIT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多