如果第一次转换失败,那么如何进行其他转换?
我有一个触发器,在数据插入表后,触发器将采用存储在列中的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?
答案 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';