Há erros que nunca cometemos. Por exemplo, um overflow num int que nos faz pensar por que raio é que a coluna não foi logo definida como bigint. Ou um destes casos que quero mostrar agora. Porque nunca acontecem.
Sabemos que se tentarmos ultrapassar certos limites, o SQL Server nos avisa.
declare @i int = 1123234243333

Ou este
declare @b bigint = 1234567890123456789
select cast(@b as int)

Mas há outros…
declare @nvarchar50 nvarchar(50)
set @nvarchar50 = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @nvarchar50

Vamos correr de novo para vermos os tamanhos reais em bytes e caracteres
declare @nvarchar50 nvarchar(50)
set @nvarchar50 = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @nvarchar50
select Data_Lenght = datalength(@nvarchar50)
select Lenght = len(@nvarchar50)
go

Sem dúvidas, temos 50 caracteres e 100 bytes.
Então quer dizer que não recebemos nenhum warning por existir truncation.
Se fizermos o mesmo com MAX…
declare @nvarcharmax nvarchar(max)
set @nvarcharmax = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @nvarcharmax
select Data_Lenght = datalength(@nvarcharmax)
select Lenght = len(@nvarcharmax)
go

Sem questões, ocupamos o espaço que necessitamos e não há truncation. Claro.
Agora imaginemos que declaramos uma variável nvarchar e nos esquecemos de colocar o tamanho…
declare @nvarchar nvarchar = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @nvarchar
select Data_Lenght = datalength(@nvarchar)
select Lenght = len(@nvarchar)
go

Ficamos apenas com o primeiro caractere, como se nota.
Mas se o erro acima é difícil de acontecer, imaginem que nos esquecemos de colocar o tamanho ao fazermos um cast. Este já tenho visto por aí…
declare @nvarchar255 nvarchar(255) = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @nvarchar255
select Data_Lenght = datalength(@nvarchar255)
select Lenght = len(@nvarchar255)
select CAST(@nvarchar255 as nvarchar)
go

Este caso é interessante, porque ficamos com 30 caracteres na nossa saída. Interessante e mais difícil de encontrar o “gato” mais tarde quando os nossos campos começarem a aparecer truncados…
Será que acontece apenas com nvarchar?
declare @varchar varchar = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @varchar
select Data_Lenght = datalength(@varchar)
select Lenght = len(@varchar)
go
declare @nchar nchar = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @nchar
select Data_Lenght = datalength(@nchar)
select Lenght = len(@nchar)
go
declare @char char = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @char
select Data_Lenght = datalength(@char)
select Lenght = len(@char)
go

Não, por omissão é sempre 1 caractere.
E nos casts?
declare @varchar255 varchar(255) = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @varchar255
select Data_Lenght = datalength(@varchar255)
select Lenght = len(@varchar255)
select CAST(@varchar255 as varchar)
go
declare @nchar255 nchar(255) = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @nchar255
select Data_Lenght = datalength(@nchar255)
select Lenght = len(@nchar255)
select CAST(@nchar255 as nchar)
go
declare @char255 char(255) = '0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999'
select @char255
select Data_Lenght = datalength(@char255)
select Lenght = len(@char255)
select CAST(@char255 as char)
go

Igual. 30 caracteres sobram da nossa string de 100.
Façam aquilo que eu digo, e não aquilo que eu fiz. 🙂
Se virem campos de texto truncados contem os caracteres existentes e se forem 30 já sabem onde procurar.