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.