【发布时间】: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