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