Pegue o seguinte código:
Declare @a integer
set @a = 0
set @a = @a | cast (1 as BINARy)
set @a = @a | cast (100 as BINARy)
select cast (@a as integer)
Agora, a saída desse código não deveria ser 5?
Eu tenho um número inteiro, defina-o como 0, então em binário são todos 0s
então eu OR
com 1 , então se torna 0..001
então OR
coloco com 100 em binário, então deve ficar 00..0101 que, em decimal é 5
A saída que realmente recebo é 101
EDIT: para maior clareza, estou tentando realizar com TSQL o que o código a seguir faz em C++
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int a;
a = 0;
a = a | 1;
cout<< a;
a = a | 0b100;
cout<<endl<<a;
}
Seu elenco não está fazendo o que você acha que deveria.
select cast(cast(100 as binary) as int)
é igual a 100. Em outras palavras, você está convertendo o valor decimal 100 para binário, não tomando '100' na notação de base 2.Sua expectativa é realmente esta:
Aliás, se este é um novo desenvolvimento, eu recomendo fortemente contra a troca de bits no SQL Server. É lento, difícil de manter e viola a primeira forma normal. Se não for, imagino que você provavelmente já saiba disso...
Para converter binário em decimal, você pode criar uma função . Existem outras maneiras de passar da notação de número inteiro para exibição na base 2 , mas parece que seria bem lento.