Um campo Text ou NText é tratado de forma um pouco diferente dos datatypes mais habituais do SQL (os int, varchar, char, etc...). Uma das diferenças é precisamente na forma como são feitas actualizaçãoes dos conteúdos de campos deste tipo.
O exemplo seguinte mostra um replace sobre um campo do tipo varchar:
create table #minhatabela (meucampo varchar(50))
insert #minhatabela values('meu teste')
select * from #minhatabela
update #minhatabela set meucampo = replace(meucampo, 'meu ', 'meu novo ')
select * from #minhatabela
drop table #minhatabela
No entanto, fazer a mesma coisa sobre um campo do tipo Text ou Ntext retorna um erro, como mostra o exemplo seguinte:
create table #minhatabela (meucampo text)
insert #minhatabela values('meu teste')
select * from #minhatabela
update #minhatabela set meucampo = replace(meucampo, 'meu ', 'meu novo ')
select * from #minhatabela
drop table #minhatabela
Este pequeno script SQL retorn o seguinte erro:
Msg 8116, Level 16, State 1, Line 6
Argument data type text is invalid for argument 1 of replace function.
Actualizar o campo do tipo Text ou NText
Então para actualizar um campo do tipo Text ou NText, é necessário utilizar um apontador para o campo a actualizar. Esse apontador deverá ser do tipo binary.
É ainda necessário identificar a posição a partir da qual se pretende actualizar.
Depois, identificando a tabela a actualizar, o apontador, a posição inicial, e o que se pretende fazer, utilizamos a instrução UPDATETEXT.
A instrução UPDATETEXT pode ser utilizada de diferentes formas: para inserir caracteres no inicio, no meio, no fim do campo, ou simplesmente para eliminar dados.
Segue-se um exemplo que inclui as diferentes utilizações da instrução UPDATETEXT:
create table #minhatabela (meucampo ntext)
insert #minhatabela values('bd')
DECLARE @ptrval binary(16), @i int
SELECT @ptrval = TEXTPTR(meucampo) FROM #minhatabela
-- Insere o caracter 'a' no inicio do conteudo do campo
UPDATETEXT #minhatabela.meucampo @ptrval 0 0 'a'
select * from #minhatabela
-- Insere o caracter 'c' no meio do conteudo do campo
UPDATETEXT #minhatabela.meucampo @ptrval 2 0 'c'
select * from #minhatabela
-- Insere o caracter 'e' no fim do conteudo do campo
set @i=(select DATALENGTH(meucampo) from #minhatabela)/2 -- Utilizar 2 apenas se se tratar de um campo do tipo NText (2 bytes/character)
UPDATETEXT #minhatabela.meucampo @ptrval @i 0 'e'
select * from #minhatabela
-- Elimina o primeiro caracter do conteudo do campo
UPDATETEXT #minhatabela.meucampo @ptrval 0 1
select * from #minhatabela
drop table #minhatabela
Length de campos Text ou NText
Apenas uma nota final. Mais uma das diferenças no tratamento deste tipo de datatypes é na utilização de instruções que permitam obter o tamanho do conteudo do campo. Usualmente é utilizada a instrução LEN, mas com campos do tipo Text e NText, a utilização desta instrução devolve um erro. Assim, a instrução a utilizar para obter o tamanho do conteúdo de um campo do tipo Text ou NText é a instrução DATALENGTH, de resto já utilizada nos exemplos acima.
E pronto! Estas foram algumas considerações sobre a manipulação de campos do tipo Text ou NText.
Um site que contém mais informação sobre a manipulação de campos deste tipo é este: http://msdn2.microsoft.com/en-us/library/aa175795(sql.80).aspx
Have fun! :)
Friday, July 27, 2007
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment