将十六进制字符串与 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
如果第一次转换失败,那么如何进行第二次转换?
我有一个触发器,在数据被插入到 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_CONVERTDECLARE @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