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

时间:2017-03-03 09:49:39

标签: sql-server tsql data-conversion

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

我有一个触发器,在数据插入表后,触发器将采用存储在列中的Hex数据,在另一列(同一行)上进行转换和更新。

目前来自我们客户的信息是,程序员可能会发送自定义Hex数据。假设文本是“hello”而hex是HexData =“68656c6c6f”。目前处于触发状态,转换如下: -

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

这将导致“你好”。但如果程序员将Hex发送为“0x68656c6c6f”,则此转换将失败并出现错误: -

  

Msg 8114,Level 16,State 5,Line 9转换数据类型varchar时出错   到varbinary。

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

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

如果2失败,我如何处理此声明,而不是1?

**发送此信息的程序员来自我的客户的另一个部门。虽然,他们说程序员会发送自定义Hex。以“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)));

返回:

  

Msg 8114,Level 16,State 5,Line 13转换数据类型varchar时出错   到varbinary。

但是这个脚本: -

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

导致: -

  

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

如何将'03141D365F531C558F0902FC65BF1851F58A21BE55ED8216AB3FD365F88C1FB347DAE176'与0x组合起来,以便它可以是0x03141D365F531C558F0902FC65BF1851F58A21BE55ED8216AB3FD365F88C1FB347DAE176?

3 个答案:

答案 0 :(得分:2)

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

OnCompleted

答案 1 :(得分:2)

不确定性能,但REPLACE的语法会更短。像上面的东西:

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

答案 2 :(得分:0)

在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';