Eu tenho um campo para armazenar alguns dados, o campo é declarado como varchar(max)
. No meu entendimento, isso deve estar armazenando 2^31 - 1
caracteres, mas quando insiro algum conteúdo com mais de 8000 caracteres, ele corta o resto.
Verifiquei que todos os dados estão incluídos na minha instrução de atualização e a consulta parece bem em todos os outros lugares, mas quando seleciono os dados de volta, eles são cortados.
Os dados são truncados quando os exponho em meu site e também quando uso o SSMS para arquivos select content from table
.
select DATALENGTH (content) from table
volta como 8000.
Eu defino os dados usando isto: update table set content = 'my long content' where id = 1
. O conteúdo tem muito HTML, mas não consigo ver isso causando problemas. A única coisa que posso ver que estou fazendo é substituir tudo "
, ''
pois isso é conteúdo inserido pelo usuário (não me lembro por que fiz isso agora).
Consegui inserir o conteúdo corretamente removendo todas as aspas simples no conteúdo, então acho que algo estranho está acontecendo com meus dados e não com o banco de dados.
Devo estar fazendo algo especial com a consulta para usar um varchar(max)
campo?
Usando: SQL Server 2008 (10.50) 64 bits.
Se você estiver construindo a string por meio de concatenação de strings, certifique-se de converter um dos literais de string explicitamente para
varchar(max)
se nenhuma das strings do componente tiver mais de 8.000 caracteres. Caso contrário, ele será tratado como um tipo de dados não máximo e a concatenação será truncada em 8.000 bytes.E seria melhor torná-lo o primeiro literal de string que é convertido
varchar(max)
para evitar truncamento caso o comprimento combinado exceda 8.000 antes que ovarchar(max)
literal seja alcançado.Estou lidando com um script que gera algum SQL dinâmico e atingiu o limite de 8000 caracteres. Meu plano astuto é ultrapassar o limite desmembrando a geração varchar(max) assim.
No entanto, descobri que realmente não precisava fazer isso.
mas quando eu imprimi @SQL ele parecia truncado... mas isso acaba sendo uma limitação dentro do próprio print e o varchar(max) estava correto.