2012-04-25 40 views
1

在兩個數據庫系統之間工作時,我需要將VARCHAR標識符轉換爲BIGINT。我的VARCHAR始終是「### - XXX-XXX - ###」形式,其中#是任何數字,X是任何字母數字字符(例如「103-AF7-GGB-005」)。這兩個###條目保證低於256,所以我想將它們中的每一個都存儲在BIGINT的單個字節中(分別是第一個和最後一個字節),其餘6個字符中的每一個都作爲一個字節存儲。使用T-SQL將VARCHAR中的各個字節轉換/連接成BIGINT

我已經在數據庫之外實現了這個功能,它解決了我需要的問題,但是現在我需要在t-sql中創建函數,而且我還沒有弄清楚該怎麼做這個。

在此先感謝您的幫助!

回答

1

你可以這樣做:

DECLARE @inp VARCHAR(100) = '223-ABC-DEF-234' 
    , @BITS BIGINT; 

SELECT @BITS = 
     CASE 
      WHEN CONVERT(BIGINT, LEFT(@inp, 3)) > 127 
       THEN (CONVERT(BIGINT, LEFT(@inp, 3))-128) * POWER(CONVERT(BIGINT, 2), 56) 
        -9223372036854775808 
      ELSE CONVERT(BIGINT, LEFT(@inp, 3)) * POWER(CONVERT(BIGINT, 2), 56) 
     END 
    + CONVERT(BIGINT, ASCII(substring(@inp, 5, 1))) * POWER(CONVERT(BIGINT, 2), 48) 
    + CONVERT(BIGINT, ASCII(substring(@inp, 6, 1))) * POWER(CONVERT(BIGINT, 2), 40) 
    + CONVERT(BIGINT, ASCII(substring(@inp, 7, 1))) * POWER(CONVERT(BIGINT, 2), 32) 
    + CONVERT(BIGINT, ASCII(substring(@inp, 9, 1))) * POWER(CONVERT(BIGINT, 2), 24) 
    + CONVERT(BIGINT, ASCII(substring(@inp, 10, 1))) * POWER(CONVERT(BIGINT, 2), 16) 
    + CONVERT(BIGINT, ASCII(substring(@inp, 11, 1))) * POWER(CONVERT(BIGINT, 2), 8) 
    + CONVERT(BIGINT, RIGHT(@INP, 3)); 

select CONVERT(binary(8), @bits); 
-- Returns 0xDF414243444546EA 

SELECT CONVERT(VARCHAR, CONVERT(INT, 0XDF)) 
    + '-' + CHAR(0X41) 
    + CHAR(0X42) 
    + CHAR(0X43) 
    + '-' + CHAR(0X44) 
    + CHAR(0X45) 
    + CHAR(0X46) 
    + '-' + CONVERT(VARCHAR, CONVERT(INT, 0XEA)); 

-- Returns 223-ABC-DEF-234: our original string 

大減法翻轉符號位。如果第一個數字大於127,則使用全部64位。由於BIGINT是帶符號的,因此乘以2^56將溢出數據類型。

+0

這正是我需要做的。謝謝您的幫助! – Belizzle 2012-04-26 15:10:20

相關問題