将十六进制字符串与 0x 组合

Combine hex string with 0x

如果第一次转换失败,那么如何进行第二次转换?

我有一个触发器,在数据被插入到 table 之后,触发器将获取列中存储的十六进制数据,在另一列(同一行)上进行转换和更新。

目前我们客户端的信息是,程序员可能会发送自定义的十六进制数据。假设文本是 "hello" 并且十六进制是 HexData = "68656c6c6f"。目前处于触发状态,转换如下所示:-

SELECT CONVERT(varchar(max),CONVERT(varbinary(MAX), HexData, 2));

这将导致 "hello"。但是如果程序员将十六进制发送为“0x68656c6c6f”,则此转换将失败并出现错误:-

Msg 8114, Level 16, State 5, Line 9 Error converting data type varchar to varbinary.

因此,如果程序员发送 HexData = "0x68656c6c6f",则此查询有效:-

SELECT CONVERT(varchar(max),CONVERT(varbinary(MAX), [HexData], 1));

如果 2 失败,我该如何放入此语句,而不是 1?

**发送此信息的程序员来自我客户的另一个部门。不过,他们说程序员会发送自定义十六进制。要么以“0x”开头,要么直接 Hex

更新:-

触发语句:-

ALTER TRIGGER [dbo].[Hex_Automation] ON  [dbo].[DimHexRaw]
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    UPDATE [DimHexRaw] SET [Data_ASCII] = (CONVERT(varchar(max),CONVERT(varbinary(MAX), [HexData], 2))),
    [Timestamp_IO] = (dateadd(microsecond,[Macrosec],TRY_CONVERT([datetime2],[Timestamp]))),
    [DateKey] = (CONVERT([varchar](35),[Timestamp],(112))),
    [TimeKey] = (replace(CONVERT([varchar](8),[Timestamp],(108)),':',''))
    WHERE [DimHexRaw].[HexData] IS NOT NULL AND [DimHexRaw].[isProcess] = 0
END

示例:

SELECT CONVERT(varchar(max),CONVERT(varbinary(MAX), '03141D365F531C558F0902FC65BF1851F58A21BE55ED8216AB3FD365F88C1FB347DAE176', 1)));

Return:

Msg 8114, Level 16, State 5, Line 13 Error converting data type varchar to varbinary.

但是使用这个脚本:-

SELECT CONVERT(varchar(max),CONVERT(varbinary(MAX), 0x03141D365F531C558F0902FC65BF1851F58A21BE55ED8216AB3FD365F88C1FB347DAE176, 1));

它导致:-

6_SU üe¿QõŠ!¾Uí‚«?ÓeøŒ³GÚáv

How to combine '03141D365F531C558F0902FC65BF1851F58A21BE55ED8216AB3FD365F88C1FB347DAE176' with 0x so it can be 0x03141D365F531C558F0902FC65BF1851F58A21BE55ED8216AB3FD365F88C1FB347DAE176?

检查前两个字符是否为0x然后进行转换

SELECT CASE WHEN LEFT([HexData], 2) = '0x'
            THEN CONVERT(varchar(max), CONVERT(varbinary(MAX), [HexData], 1))
            ELSE CONVERT(varchar(max), CONVERT(varbinary(MAX), [HexData], 2))
       END
FROM tableName

在SQL Server 2012+

中使用TRY_CONVERT
DECLARE @Hexdata varchar(200) = '0x68656c6c6f'

IF TRY_CONVERT(varbinary(MAX), @Hexdata, 2) IS NOT NULL
    SELECT TRY_CONVERT(varchar(max),CONVERT(varbinary(MAX), @Hexdata, 2));
ELSE IF TRY_CONVERT(varbinary(MAX), @Hexdata, 1) IS NOT NULL
    SELECT TRY_CONVERT(varchar(max),CONVERT(varbinary(MAX), @Hexdata, 1));
ELSE
    SELECT 'No chance';

SET @Hexdata = '68656c6c6f';

IF TRY_CONVERT(varbinary(MAX), @Hexdata, 2) IS NOT NULL
    SELECT TRY_CONVERT(varchar(max),CONVERT(varbinary(MAX), @Hexdata, 2));
ELSE IF TRY_CONVERT(varbinary(MAX), @Hexdata, 1) IS NOT NULL
    SELECT TRY_CONVERT(varchar(max),CONVERT(varbinary(MAX), @Hexdata, 1));
ELSE
    SELECT 'No chance';

不确定性能,但 REPLACE 语法会更短。类似上面的内容:

SELECT CONVERT(varchar(max), CONVERT(varbinary(MAX), REPLACE([HexData], '0x', ''), 2)) AS ConvertedHex
FROM tablename