Vou falar de um tipo de campo muito pouco utilizado, porém podemos nos deparar com situações onde teremos que manipulá-los e pode ser uma grande dor de cabeça, até mesmo pela pouca utilização e poucos exemplos.
Este tipo de campo armazena dados não Unicode de comprimento variável na página de código do servidor e com um comprimento máximo de 2^31-1 (2,147,483,647) caracteres. Quando a página de código de servidor usar caracteres de dois bytes, o armazenamento ainda será de 2.147.483.647 bytes. Dependendo da cadeia de caracteres, o tamanho do armazenamento pode ser menor que 2.147.483.647 bytes. O uso deste tipo de campo não é recomendado pela Microsoft, pois o mesmo tem seus dias contados para próximas versões do SQL Server. Ele utiliza caracteres não Unicode por conseqüência não usa conjunto UCS-2.
Além disso, este tipo de arquivo possui estrutura bem particular para manipulação. Vou mostrar a utilização de algumas funções de leitura, escrita e atualização destes campos, mas antes disto, vamos criar uma tabela como exemplo para realizarmos todos os testes em cima dela:
create table Teste1 ( inteiro int, texto text); Vamos inserir alguns dados para trabalharmos em cima destes: insert into teste1 values( 1,'Este é um exemplo de texto para ser inserido no SQL Server em um campo do typo de dados text. Devido seu tamanho não é possível inserí-lo em um campo varchar normal, neste caso foi usado text para exemplo'); insert into teste1 values( 2,'Este é um exemplo menor de text para exemplo'); </pre>
Um detalhe bastante importante neste caso é que o campo text aceita ser inserido dados como se estivéssemos tratando de um campo varchar.
Ressaltamos que todas as funções a seguir bem como o tipo de dados serão descontinuadas posteriormente. Também veremos em todos os exemplos a seguir a utilização da função TextPTR que retorna o valor do ponteiro de texto que corresponde a uma coluna text no formato varbinary. O valor do ponteiro de texto recuperado pode ser usado nas instruções que vamos utilizar READTEXT, WRITETEXT e UPDATETEXT.
Writetext
Substitui quaisquer dados existentes na coluna afetada, é como um update de um campo atribuindo valor referenciado no WriteText, como no exemplo:
WRITETEXT [BULK] { table.column text_ptr } [ WITH LOG ] { data } DECLARE @ptrval binary(16); SELECT @ptrval = TEXTPTR(texto) FROM teste1 where inteiro = 1 WRITETEXT teste1.texto @ptrval 'This is an example of text to be inserted into SQL Server in a field of type of text data. Because of its size can not insert it into a varchar field normal in this case was used text for example' GO </pre>
ReadText
Este lê valores text de uma coluna começando em um deslocamento especificado e lendo o número especificado de bytes.
READTEXT { table.column text_ptr offset size } [ HOLDLOCK ] DECLARE @ptrval binary(16); SELECT @ptrval = TEXTPTR(texto) FROM teste1 where inteiro = 1 READTEXT teste1.texto @ptrval 0 0 GO </pre>
Neste exemplo os parâmetros, offset refere o a posição onde será iniciada a leitura e size é a quantidade de bytes ou catacteres que serão lidos.
Caso ambos fiquem com 0(zero) como no exemplo, será lido todo o campo.
UpdateText
Atualiza um campo text existente. Usa-se UPDATETEXT para alterar somente parte de uma coluna. Este é como um update de uma coluna = coluna + 'novos valores'. Para atribuir valor diretamente a um campo use o WRITETEXT.
UPDATETEXT [BULK] { table_name.dest_column_name dest_text_ptr } { NULL | insert_offset } { NULL | delete_length } [ WITH LOG ] [ inserted_data | { table_name.src_column_name src_text_ptr } ] DECLARE @ptrval binary(16); SELECT @ptrval = TEXTPTR(texto) FROM teste1 where inteiro = 1 --inserindo no início UPDATETEXT teste1.texto @ptrval 0 0 '!'; --inserindo no final UPDATETEXT teste1.texto @ptrval NULL 0 '?'; GO </pre>
Neste caso colocamos dois exemplos de atualização, um inserindo no início do campo e outro no final, ambos são utilizados de forma genérica pois não estamos utilizando uma posição predeterminadas para o campo.
Os parâmetros insert_offset é a posição inicial baseada em zero para a atualização, 0 (zero) informa que será inserido a partir do início e NULL remete ao final do campo outros valores referenciam a posição que iniciará a inserção. Já o parâmetro delete_length> é a quantidade de caracteres a serem excluídos a partir do parâmetro insert_offset.
Espero que possa ajudar a todos que tiverem algum tipo de contato com este tipo de campo. Até a próxima.