Num select into o campo é nullable se o campo da tabela original é nullable.

Passa muitas vezes despercebido aos mais incautos.

Mesmo que tenhamos uma query em que explicitamente colocamos uma coluna not null, o select into vai deixar a definição da coluna nullable.

Mas porque é que isso interessa?

Interessa porque sabemos que é muito mais do que um preciosismo definirmos o nosso modelo de dados como deve de ser.

Há muitas maneiras de o SQL Server melhorar um plano de execução se “souber” que certas colunas não aceitam nulls. Um caso típico é quando temos um NOT IN.

Acabo por ver algumas vezes casos em que temos uma tabela que aceita nulls numa coluna mas que na realidade não tem nenhum.
Ou mais facilmente ainda, tem alguns valores null mas só estamos interessados em certo processamento dos valores not null.

Acabamos por criar temporárias com um select into e não vamos verificar o que ele resolveu usar como tipo de dados.

Como neste exemplo:

create table dbo.nulltest(
	col1 int null,
	col2 int not null
) 
go

insert into dbo.nulltest
values 
	(1,1)
,	(null, 1)
,	(2,2)
,	(3,3)
go


select *
from dbo.nulltest

Agora criamos a nossa tabela temporária

select *
into #null_test_temp
from dbo.nulltest
where col1 is not null

select *
from #null_test_temp

E se formos ver o que temos na definição da tabela temporária que acabámos de criar?

exec tempdb..sp_help '#null_test_temp'

Exactamente. Por mais que lhe tenhamos dito que os valores da coluna eram not null ele criou o campo com a definição que tinha, nullable.


O facto de termos apenas colocado linhas sem nulls naquela coluna não quer dizer que venhamos a alterar ou colocar algumas a null.

Se o que queremos é ter a tabela com a coluna not nullable, ou criamos a tabela antes e depois insert into ou então depois de fazermos o select into mudarmos a coluna para not null.

alter table #null_test_temp
alter column col1 int not null

exec tempdb..sp_help '#null_test_temp'

“Mesmo que tenhamos uma query em que explicitamente colocamos uma coluna not null, o select into vai deixar a definição da coluna nullable.”

Sim, e até tem bastante lógica que assim o faça.

Share

You may also like...

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *