[SQL] 정수 진수와 진수로 정수로 변환
SQL정수 진수와 진수로 정수로 변환
나는이 쿼리 작업이 그래서베이스에서 (signal_data는 열입니다)하지만, 마이크로 소프트 SQL 서버에서 작동하지 않습니다 :
HEXTOINT(SUBSTRING((INTTOHEX(signal_data)),5,2)) as Signal
또한 (A1이 값을 포함) Excel에서있다 :
=HEX2DEC(LEFT(DEC2HEX(A1),LEN(DEC2HEX(A1))-2))
누구 알고 나는 SQL 서버에서이 작업을 수행 할 않는 방법?
해결법
-
==============================
1.진수를 INT로 변환 :
진수를 INT로 변환 :
SELECT CONVERT(VARBINARY(8), 16777215)
INT에 진수로 변환 :
SELECT CONVERT(INT, 0xFFFFFF)
위의 예는 HEX 값이 정수 리터럴로 주어진 경우에만 작동하는 한계를 갖는다. 완성도를 들어, 변환 할 수있는 값은 16 진수 문자열 (예 : VARCHAR 컬럼에서 발견) 사용하는 것이다 :
-- If the '0x' marker is present: SELECT CONVERT(INT, CONVERT(VARBINARY, '0x1FFFFF', 1)) -- If the '0x' marker is NOT present: SELECT CONVERT(INT, CONVERT(VARBINARY, '1FFFFF', 2))
참고 : 문자열은 16 진수의 짝수를 포함해야합니다. 숫자의 홀수 에러를 산출한다.
자세한 내용은 CAST 및 CONVERT (Transact-SQL)를 참조하십시오의 "진 스타일"섹션에서 찾을 수 있습니다. 나는 SQL Server 2008을 믿는 이상이 필요합니다.
-
==============================
2.사실, 내장 기능 master.dbo.fn_varbintohexstr 지정됩니다.
사실, 내장 기능 master.dbo.fn_varbintohexstr 지정됩니다.
따라서, 예를 들어 :
SELECT 100, master.dbo.fn_varbintohexstr(100)
당신을 제공합니다
(100) 0x00000064
-
==============================
3.Excel의 문자열 기반 DEC2HEX, HEX2DEC 기능에 SQL 서버 등가물 :
Excel의 문자열 기반 DEC2HEX, HEX2DEC 기능에 SQL 서버 등가물 :
--Convert INT to hex string: PRINT CONVERT(VARCHAR(8),CONVERT(VARBINARY(4), 16777215),2) --DEC2HEX --Convert hex string to INT: PRINT CONVERT(INT,CONVERT(VARBINARY(4),'00FFFFFF',2)) --HEX2DEC
-
==============================
4.진수를 INT로 변환 :
진수를 INT로 변환 :
SELECT FORMAT (512 + 255, 'X')
-
==============================
5.그것은 SQL Server에서 위의 2012 사용할 수있는 기능 형식을 사용하여 가능하다
그것은 SQL Server에서 위의 2012 사용할 수있는 기능 형식을 사용하여 가능하다
select FORMAT(10,'x2')
결과 :
0a
-
==============================
6.기존의 4 비트 진수 꽤 직접입니다. 정수에 진수 문자열 (가정 값이 xString라는 필드에 저장됩니다)
기존의 4 비트 진수 꽤 직접입니다. 정수에 진수 문자열 (가정 값이 xString라는 필드에 저장됩니다)
CONVERT(BIGINT,CONVERT(varbinary(4), (SELECT master.dbo.fn_cdc_hexstrtobin( LEFT(FMEID_ESN,8) )) ))
진수 문자열을 정수 (가정 값이 FInteger라는 필드에 저장됩니다)
(SELECT master.dbo.fn_varbintohexstr(CONVERT(varbinary,CONVERT(int, FInteger ))))
주의하는 것이 중요 당신이 특히 인텔 시스템에서, 원인 레지스터를 공유하는 것이 비트 크기를 사용하기 시작하면, 레지스터에 높고 낮은과 왼쪽과 권리 인해 인텔의 리틀 엔디안 특성으로 교체 될 것입니다. VARBINARY (3)을 사용하는 경우 예를 들어, 우리는 6 자 진수에 대해 얘기하고. 이 경우, 비트는 오른쪽에서 "54,32,10"왼쪽으로 다음 인덱스로 짝. 인텔 시스템에서는 "76,54,32,10"을 기대. 만 8의 6을 사용하고 있기 때문에, 당신은 스왑에게 자신을 기억해야합니다. "76,54"왼쪽으로 자격을하고 "32, 10"권리로 인정됩니다. 쉼표는 높고 낮은 분리한다. 인텔은 높은 기온, 다음 왼쪽과 권리를 교환합니다. 그래서 변환을 수행하는 ... 한숨, 당신은 그들에게 예를 들어 자신을 교환 할 수있어, 다음과 같은 변환하는 8 자리 16 진수의 첫 6 :
(SELECT master.dbo.fn_replvarbintoint( CONVERT(varbinary(3),(SELECT master.dbo.fn_cdc_hexstrtobin( --intel processors, registers are switched, so reverse them ----second half RIGHT(FHex8,2)+ --0,1 (0 indexed) LEFT(RIGHT(FHex8,4),2)+ -- 2,3 (oindex) --first half LEFT(RIGHT(FHex8,6),2) --4,5 ))) ))
나는 8 자리 16 진수의 (VARBINARY (4)) 내 변환을 유지하려고 것이다, 그래서 그것은 조금 복잡합니다.
요약하면,이 귀하의 질문에 대답해야한다. 종합적.
-
==============================
7.여기 VARCHAR로서 16 진수 표현으로 변환하는 정수 값이 SQL 서버의 함수이다. 다른 데이터베이스 유형에 적응하기 쉬워야한다
여기 VARCHAR로서 16 진수 표현으로 변환하는 정수 값이 SQL 서버의 함수이다. 다른 데이터베이스 유형에 적응하기 쉬워야한다
예를 들면 :
SELECT dbo.ToHex(4095) --> FFF
SQL :
CREATE FUNCTION ToHex(@value int) RETURNS varchar(50) AS BEGIN DECLARE @seq char(16) DECLARE @result varchar(50) DECLARE @digit char(1) SET @seq = '0123456789ABCDEF' SET @result = SUBSTRING(@seq, (@value%16)+1, 1) WHILE @value > 0 BEGIN SET @digit = SUBSTRING(@seq, ((@value/16)%16)+1, 1) SET @value = @value/16 IF @value <> 0 SET @result = @digit + @result END RETURN @result END GO
-
==============================
8.
Declare @Dato xml Set @Dato = Convert(xml, '<dato>FF</dato>') Select Cast( rw.value( 'xs:hexBinary( text()[1])' , 'varbinary(max)' ) as int ) From @Dato.nodes('dato') as T(rw)
-
==============================
9.사용 master.dbo.fnbintohexstr (16777215)는 VARCHAR 표현으로 변환합니다.
사용 master.dbo.fnbintohexstr (16777215)는 VARCHAR 표현으로 변환합니다.
-
==============================
10.Maksym Kozlenko에 의한 대답은 좋은 약간 코드 형식으로 숫자 값을 인코딩 처리하기 위해 수정 될 수 있습니다. 예를 들면 :
Maksym Kozlenko에 의한 대답은 좋은 약간 코드 형식으로 숫자 값을 인코딩 처리하기 위해 수정 될 수 있습니다. 예를 들면 :
CREATE FUNCTION [dbo].[IntToAlpha](@Value int) RETURNS varchar(30) AS BEGIN DECLARE @CodeChars varchar(100) SET @CodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' DECLARE @CodeLength int = 26 DECLARE @Result varchar(30) = '' DECLARE @Digit char(1) SET @Result = SUBSTRING(@CodeChars, (@Value % @CodeLength) + 1, 1) WHILE @Value > 0 BEGIN SET @Digit = SUBSTRING(@CodeChars, ((@Value / @CodeLength) % @CodeLength) + 1, 1) SET @Value = @Value / @CodeLength IF @Value <> 0 SET @Result = @Digit + @Result END RETURN @Result END
그래서, 1 억 5000 만 같은 큰 숫자는 단지 6 자 (150000000 = "MQGJMU을")가된다
당신은 또한 암호화 장치로 다른 시퀀스에 다른 문자를 사용할 수 있습니다. 또는 암호화를위한 염장 방법으로 코드 문자와 문자 사용의 길이를 전달합니다.
그리고 역 :
CREATE FUNCTION [dbo].[AlphaToInt](@Value varchar(7)) RETURNS int AS BEGIN DECLARE @CodeChars varchar(100) SET @CodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' DECLARE @CodeLength int = 26 DECLARE @Digit char(1) DECLARE @Result int = 0 DECLARE @DigitValue int DECLARE @Index int = 0 DECLARE @Reverse varchar(7) SET @Reverse = REVERSE(@Value) WHILE @Index < LEN(@Value) BEGIN SET @Digit = SUBSTRING(@Reverse, @Index + 1, 1) SET @DigitValue = (CHARINDEX(@Digit, @CodeChars) - 1) * POWER(@CodeLength, @Index) SET @Result = @Result + @DigitValue SET @Index = @Index + 1 END RETURN @Result
-
==============================
11.주어진:
주어진:
declare @hexStr varchar(16), @intVal int
IntToHexStr :
select @hexStr = convert(varbinary, @intVal, 1)
HexStrToInt :
declare @query varchar(100), @parameters varchar(50) select @query = 'select @result = convert(int,' + @hb + ')', @parameters = '@result int output' exec master.dbo.Sp_executesql @query, @parameters, @intVal output
-
==============================
12.Maksym Kozlenko 좋은 솔루션을 가지고 있으며, 다른 사람은 그것의 잠재력을 잠금 해제 가까이 오지하지만 당신은 문자의 순서를 정의하고, 자료로의 길이를 사용할 수있는 실현에 완전히 그리워. 어느 나는 그의 해결책이 약간 수정 된 버전을 좋아하는 이유는 기본 16, 또는 기본 (17), 등을 위해 일 수 있기 때문이다
Maksym Kozlenko 좋은 솔루션을 가지고 있으며, 다른 사람은 그것의 잠재력을 잠금 해제 가까이 오지하지만 당신은 문자의 순서를 정의하고, 자료로의 길이를 사용할 수있는 실현에 완전히 그리워. 어느 나는 그의 해결책이 약간 수정 된 버전을 좋아하는 이유는 기본 16, 또는 기본 (17), 등을 위해 일 수 있기 때문이다
예를 들어, 문자와 숫자를 원하지만 0의처럼 보이는 1 개의와 O의처럼 보이는에 대한처럼하지 않으면 어떻게. 당신은 어떤 순서이 방법을 정의 할 수 있습니다. 아래는 I 및 O에 "개질 기부 (34)"를 생성하도록 스킵는 "베이스 (36)"의 형태이다. 대신 진수로 실행하는 육각 라인을 취소합니다 언급.
declare @value int = 1234567890 DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34 --DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex DECLARE @result varchar(50) DECLARE @digit char(1) DECLARE @baseSize int = len(@seq) DECLARE @workingValue int = @value SET @result = SUBSTRING(@seq, (@workingValue%@baseSize)+1, 1) WHILE @workingValue > 0 BEGIN SET @digit = SUBSTRING(@seq, ((@workingValue/@baseSize)%@baseSize)+1, 1) SET @workingValue = @workingValue/@baseSize IF @workingValue <> 0 SET @result = @digit + @result END select @value as Value, @baseSize as BaseSize, @result as Result
또한 개인적인 선호도 조사 결과, 다음 작업 값의 복사본에서 작업을 작업 값을 통해 값을 이동합니다.
다음 시퀀스의 길이로 정의 염기, 모든 시퀀스에 대해, 변환을 반전 추가된다.
declare @value varchar(50) = 'T5URAA' DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34 --DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex DECLARE @result int = 0 DECLARE @digit char(1) DECLARE @baseSize int = len(@seq) DECLARE @workingValue varchar(50) = @value DECLARE @PositionMultiplier int = 1 DECLARE @digitPositionInSequence int = 0 WHILE len(@workingValue) > 0 BEGIN SET @digit = right(@workingValue,1) SET @digitPositionInSequence = CHARINDEX(@digit,@seq) SET @result = @result + ( (@digitPositionInSequence -1) * @PositionMultiplier) --select @digit, @digitPositionInSequence, @PositionMultiplier, @result SET @workingValue = left(@workingValue,len(@workingValue)-1) SET @PositionMultiplier = @PositionMultiplier * @baseSize END select @value as Value, @baseSize as BaseSize, @result as Result
-
==============================
13.
IIF(Fields!HIGHLIGHT_COLOUR.Value="","#FFFFFF","#" & hex(Fields!HIGHLIGHT_COLOUR.Value) & StrDup(6-LEN(hex(Fields!HIGHLIGHT_COLOUR.Value)),"0"))
글꼴 색상 표현으로 나를 위해 노력하고 있습니다
-
==============================
14.INT에 진수 문자열로 변환하기 위해, 나는 과거에 이것을 사용했습니다. 그것은 사실 INT 모든 기반을 변환 할 수정할 수 있습니다 (진수, 바이너리, 무엇이든)
INT에 진수 문자열로 변환하기 위해, 나는 과거에 이것을 사용했습니다. 그것은 사실 INT 모든 기반을 변환 할 수정할 수 있습니다 (진수, 바이너리, 무엇이든)
Declare @Str varchar(200) Set @str = 'F000BE1A' Declare @ndx int Set @ndx = Len(@str) Declare @RunningTotal BigInt Set @RunningTotal = 0 While @ndx > 0 Begin Declare @Exponent BigInt Set @Exponent = Len(@Str) - @ndx Set @RunningTotal = @RunningTotal + Power(16 * 1.0, @Exponent) * Case Substring(@str, @ndx, 1) When '0' then 0 When '1' then 1 When '2' then 2 When '3' then 3 When '4' then 4 When '5' then 5 When '6' then 6 When '7' then 7 When '8' then 8 When '9' then 9 When 'A' then 10 When 'B' then 11 When 'C' then 12 When 'D' then 13 When 'E' then 14 When 'F' then 15 End Set @ndx = @ndx - 1 End Print @RunningTotal
-
==============================
15.다음은 두 가지 기능은 다음과 같습니다 dbo.HexToInt 및 dbo.IntToHex, 나는 같은 변환을 사용 :
다음은 두 가지 기능은 다음과 같습니다 dbo.HexToInt 및 dbo.IntToHex, 나는 같은 변환을 사용 :
if OBJECT_ID('dbo.HexToInt') is not null drop function dbo.HexToInt GO create function dbo.HexToInt (@chars varchar(max)) returns int begin declare @char varchar(1), @len int, @i int, @r int, @tmp int, @pow int set @chars = RTRIM(LTRIM(@chars)) set @len = LEN(@chars) set @i = 1 set @r = 0 while @i <= @len begin set @pow = @len - @i set @char = SUBSTRING(@chars, @i, 1) if @char = '0' set @tmp = 0 else if @char = '1' set @tmp = 1 else if @char = '2' set @tmp = 2 else if @char = '3' set @tmp = 3 else if @char = '4' set @tmp = 4 else if @char = '5' set @tmp = 5 else if @char = '6' set @tmp = 6 else if @char = '7' set @tmp = 7 else if @char = '8' set @tmp = 8 else if @char = '9' set @tmp = 9 else if @char = 'A' set @tmp = 10 else if @char = 'B' set @tmp = 11 else if @char = 'C' set @tmp = 12 else if @char = 'D' set @tmp = 13 else if @char = 'E' set @tmp = 14 else if @char = 'F' set @tmp = 15 set @r = @r + @tmp * POWER(16,@pow) set @i = @i + 1 end return @r end
그리고 두 번째 :
if OBJECT_ID('dbo.IntToHex') is not null drop function dbo.IntToHex GO create function dbo.IntToHex (@val int) returns varchar(max) begin declare @r varchar(max), @tmp int, @v1 int, @v2 int, @char varchar(1) set @tmp = @val set @r = '' while 1=1 begin set @v1 = @tmp / 16 set @v2 = @tmp % 16 if @v2 = 0 set @char = '0' else if @v2 = 1 set @char = '1' else if @v2 = 2 set @char = '2' else if @v2 = 3 set @char = '3' else if @v2 = 4 set @char = '4' else if @v2 = 5 set @char = '5' else if @v2 = 6 set @char = '6' else if @v2 = 7 set @char = '7' else if @v2 = 8 set @char = '8' else if @v2 = 9 set @char = '9' else if @v2 = 10 set @char = 'A' else if @v2 = 11 set @char = 'B' else if @v2 = 12 set @char = 'C' else if @v2 = 13 set @char = 'D' else if @v2 = 14 set @char = 'E' else if @v2 = 15 set @char = 'F' set @tmp = @v1 set @r = @char + @r if @tmp = 0 break end return @r end
from https://stackoverflow.com/questions/703019/convert-integer-to-hex-and-hex-to-integer by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server는 날짜 시간에 대 Varchar로 변환 (0) | 2020.03.30 |
---|---|
[SQL] Parameters.Add (문자열, 객체)와 Parameters.AddWithValue의 차이 (0) | 2020.03.30 |
[SQL] 는 SQL 표준 역 따옴표 ( ')의 사용에 대해 무엇을 말하는가? (0) | 2020.03.30 |
[SQL] SQL Server 2008의 페이지 매김을 수행하는 방법 (0) | 2020.03.30 |
[SQL] (가) SQL 또는 MySQL의에서 키워드 조인을 사용하지 않는 조인이 뭔가 잘못인가? (0) | 2020.03.30 |