Manipulando campos TEXT

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’);
 

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

 

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
 
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
 

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.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s