2017-03-03 43 views
1

如果第一次轉換失敗,那麼如何做另一次轉換?結合十六進制字符串與0x

我有一個觸發器,在數據被插入到表後,觸發器將把十六進制數據存儲在列中,在另一列(同一行)上進行轉換和更新。

目前我們客戶的信息是,程序員可能會發送自定義十六進制數據。假設文本是「你好」,十六進制是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失敗,我怎麼能把這個陳述放進去呢?

**發送此信息的程序員來自我的客戶的另一個部門。雖然他們說程序員會發送自定義的Hex。

觸發聲明: - - :要麼以 「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))); 

返回:

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

如何結合 '03141D365F531C558F0902FC65BF1851F58A21BE55ED8216AB3FD365F88C1FB347DAE176' 以0x所以可以0x03141D365F531C558F0902FC65BF1851F58A21BE55ED8216AB3FD365F88C1FB347DAE176?

+1

您正在使用哪個版本的SQL Server? SQL 2012及更高版本具有可用於執行安全轉換測試的'TRY_CONVERT','TRY_CAST'和'TRY_PARSE'。 –

+0

埃德,我也使用TRY_CONVERT,但結果,它通過並使列變爲空 – Luiey

回答

2

不知道的性能,但REPLACE將有更短的語法。類似上述:

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

你的腳本適用於我的觸發器,它在低於10分鐘的4.5百萬條記錄中使用「INSERT SELECT *」,並且所有十六進制轉換爲..謝謝 – Luiey

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 
+0

嗨MH,這個語法可以在觸發器中使用嗎? – Luiey

0

使用TRY_CONVERT在SQL Server 2012+

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