Data

15 set, 2011

INT para string BINARY no SQL Server

Publicidade

O SQL Server não tem uma maneira nativa de
converter INTs para BINARY.

Executando

SELECT CAST(25 AS BINARY)

Na
verdade, ele retorna 19, que é seu equivalente hexadecimal, não o
binário.

Abaixo você pode ver a diferença entre as 3 representações numéricas:

Integer: 25
Binário: 11001
Hexadecimal: 19

Então, eu tinha duas necessidades:

  • Ter a representação BIN de
    25 como uma string: ‘11001’
  • Ser capaz de configurar um
    tamanho mínimo de resultado fixo: fixedSize=2 : ‘11001’, fixedSize=5 : ‘11001’ e fixedSize=10 : ‘0000011001’

Melhor solução

Depois de postar este artigo, eu acionei o gênio
que existia dentro do meu grande amigo Tiago Guedes, que sugeriu uma solução muito mais limpa:

ALTER FUNCTION INT2BIN
(
@value INT,
@fixedSize INT = 10
)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @result VARCHAR(MAX) = '';

WHILE @value >= 1
BEGIN
SELECT @result = CAST(@value % 2 AS VARCHAR) + @result, @value = @value / 2
END;

IF(@fixedSize > LEN(@result))
BEGIN
SELECT @result = REPLICATE('0', @fixedSize - LEN(@result)) + @result
END;

RETURN @result;
END
GO

Minha solução inicial

Por razões históricas, deixo aqui minhas duas
maneiras iniciais de fazer a mesma coisa.

CREATE FUNCTION INT2BIN
(
@value INT,
@fixedSize INT = 10
)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @result VARCHAR(1000) = '';

WHILE (@value != 0)
BEGIN
IF(@value%2 = 0)
SET @Result = '0' + @Result;
ELSE
SET @Result = '1' + @Result;

SET @value = @value / 2;
END;

IF(@FixedSize > 0 AND LEN(@Result) < @FixedSize)
SET @result = RIGHT('00000000000000000000' + @Result, @FixedSize);

RETURN @Result;
END
GO

Cuidado: o
código acima somente suporta valores @FixedSize iguais ou menores que 20. Se
você precisar suportar valores maiores, apenas adicione mais zeros ao argumento ‘RIGHT’. Outra opção é deixar esse preenchimento dinâmico ao introduzir outro
loop.

CREATE FUNCTION INT2BIN
(
@value INT,
@fixedSize INT = 10
)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @result VARCHAR(1000) = '';

WHILE (@value != 0)
BEGIN
IF(@value%2 = 0)
SET @Result = '0' + @Result;
ELSE
SET @Result = '1' + @Result;

SET @value = @value / 2;
END;

IF(@fixedSize IS NOT NULL AND @fixedSize > 0 AND LEN(@Result) < @fixedSize)
BEGIN
DECLARE @len INT = @fixedSize;
DECLARE @padding VARCHAR(1000) = '';

WHILE @len > 0
BEGIN
SET @padding = @padding + '0';
SET @len = @len-1;
END;
SET @result = RIGHT(@padding + @result, @fixedSize);
END;

RETURN @result;
END
GO

?

Texto
original disponível em 
http://www.instanceofanobject.com/2011/06/int-to-binary-string-in-sql-server.html