2012-04-25 11 views
1

2つのデータベースシステム間で作業するために、VARCHAR識別子をBIGINTに変換する必要があります。私のVARCHARは常に "### - XXX-XXX - ###"という形式です。ここで、#は任意の数字で、Xは任意の英数字です(例: "103-AF7-GGB-005")。 2つの###エントリは256以下であることが保証されているので、BIGINTの1バイト(それぞれ最初と最後のバイト)にそれらのそれぞれを格納したいと思います。VARCHARの個々のバイトをT-SQLを使用して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

関連する問題