【问题标题】:Combine hex string with 0x将十六进制字符串与 0x 组合
【发布时间】:2017-03-03 09:49:38
【问题描述】:

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

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

目前来自我们客户的信息是,程序员可能会发送自定义的十六进制数据。假设文本是“hello”,十六进制是 HexData = “68656c6c6f”。目前正在触发,转换如下:-

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

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

消息 8114,级别 16,状态 5,行 9 转换数据类型 varchar 时出错 到 varbinary。

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

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

如果 2 失败,那么我如何输入这个语句,而不是 1?

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

更新:-

触发语句:-

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)));

返回:

消息 8114,级别 16,状态 5,行 13 转换数据类型 varchar 时出错 到 varbinary。

但是有了这个脚本:-

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

结果:-

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

如何以0x结合 '03141D365F531C558F0902FC65BF1851F58A21BE55ED8216AB3FD365F88C1FB347DAE176',因此它可以是0x03141D365F531C558F0902FC65BF1851F58A21BE55ED8216AB3FD365F88C1FB347DAE176? P>

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server? SQL 2012 及更高版本有TRY_CONVERT、TRY_CAST 和TRY_PARSE,可用于进行安全转换测试。
  • Ed,我也使用了 TRY_CONVERT,但结果,它通过并使列变为空

标签: sql-server tsql data-conversion


【解决方案1】:

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

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

【讨论】:

  • 您的脚本与我的触发器配合得很好,它在 10 分钟内对 450 万条记录使用“INSERT SELECT *”,并且所有十六进制都转换了......谢谢
【解决方案2】:

检查前两个字符是否为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

【讨论】:

  • 嗨,MH,这个语法可以在触发器中使用吗?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2019-07-27
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多