SQL Server 2008 R2:如何识别和更新十六进制值

SQL Server 2008 R2: How to identify and update hexadecimal value

我有以下 table 称为 Hexa_Table,它只包含一列,即 val

Table: 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,为此我需要确定这是 table.

中的 Hexadecimal

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

转换使用:This

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

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

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

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

旁注:

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

CONVERT(VARCHAR(MAX), 0x48656c70)

要找出十六进制值,您可以执行以下操作:

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

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

试试这个代码:

BEGIN TRAN

SELECT * FROM Hexa_Table 
WHERE val = @value_insert

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

COMMIT

您可以将 CONVERT 与样式 1 结合使用。在你的场景中是这样的。

您可以使用过滤器 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