Se bem se lembram, há uns dias fiz aqui um post a relembrar termos cuidado quando fazemos um select into para uma temporária.
Este é outro caso em que as coisas podem não acabar como esperámos.
Da última vez mostrei como num select into o coluna fica nullable se a tabela fonte tem a coluna nullable.
Nesta demo mostro o contrário, como partimos de uma coluna que não aceita nulls para uma coluna que aceita.
Parece difícil, mas é mesmo tão simples…
Vamos criar uma tabela com alguns campos mais do que da outra vez.
create table nulltest02
(
int1 int not null
, int2 int
, var1 varchar(255) not null
, var2 varchar(255)
, bit1 bit not null
, bit2 bit
, char1 char(255) not null
, char2 char(255)
)
insert into nulltest02
values
( 1, 1, '0123456789', '0123456789', 1, 1, '0123456789', '0123456789')
, ( 1, null, '0123456789', null, 1, null, '0123456789', null)
, ( 2, 2, '01234567890123456789', '01234567890123456789', 2, 2, '01234567890123456789', '01234567890123456789')
, ( 2, null, '0123456789', null, 2, null, '0123456789', null)
, ( 3, 3, '012345678901234567890123456789', '012345678901234567890123456789', 3, 3, '012345678901234567890123456789', '012345678901234567890123456789')
, ( 3, null, '012345678901234567890123456789', null, 3, null, '012345678901234567890123456789', null)
select * from nulltest02

Fazemos o mesmo que da outra vez… select into.
select *
into #null_test_temp_02
from nulltest02
where int2 is not null
and var2 is not null
and bit2 is not null
and char2 is not null
exec tempdb..sp_help '#null_test_temp_02'

Tudo bem até agora, já vimos isto antes.
Mas… e se por alguma razão fizermos um cast, masmo que seja um cast exactamente para o mesmo tipo?
select
int1 = cast(int1 as int)
, int2 = cast(int2 as int)
, var1 = cast(var1 as varchar(150))
, var2 = cast(var2 as varchar(150))
, bit1 = cast(bit1 as bit)
, bit2 = cast(bit2 as bit)
, char1 = cast(char1 as char(150))
, char2 = cast(char2 as char(150))
into #null_test_temp_03
from nulltest02
where int2 is not null
and var2 is not null
and bit2 is not null
and char2 is not null
exec tempdb..sp_help '#null_test_temp_03'

Pois é… todas as colunas agora aceitam nulls.
Mas isto é uma coisa que todos já sabíamos, não é? 🙂