Eu tenho uma tabela com uma NTEXT
coluna chamada comments
. Eu tenho uma segunda string, vamos chamá-la de anothercomment
(a varchar
) que precisa ser colocada dentro de uma determinada comments
string após a palavra UPDATEHERE
.
A conversão para nvarchar(max)
trunca a comments
string, portanto, não posso usar algo como CHARINDEX()
( Msg 8152, Level 16, State 10, Line 2
String or binary data would be truncated.)
. Usei datalength()
para verificar se há alguns milhares de colunas com mais de 8.000 caracteres.
Um exemplo do que quero alcançar (embora com strings muito mais longas):
comentários -
This is a test UPDATEHERE This is the end of the test
outro comentário -
. This is inserted.
Cadeia de caracteres resultante -
This is a test UPDATEHERE. This is inserted. This is the end of the test
Eu percebo que isso é trivial com um normal varchar()
/ nvarchar()
, mas ntext
é um pesadelo completo e absoluto para se trabalhar. Sei que é um tipo de dados obsoleto, mas não escrevi o aplicativo em questão.
Converter para
nvarchar(max)
e voltar parantext
torna a vida mais simples do ponto de vista do código, mas significa converter e reescrever todo o valor (talvez muito grande), com toda a sobrecarga de CPU e registro que isso implica.Uma alternativa é usar
UPDATETEXT
. Isso é obsoleto, assim comontext
, mas pode reduzir significativamente a sobrecarga de registro. Por outro lado, significa usar ponteiros de texto e opera apenas em uma linha por vez.O código de exemplo a seguir usa um cursor para contornar essa limitação e usa
PATINDEX
em vez de ,CHARINDEX
pois o primeiro é uma das poucas funções que funcionam diretamente comntext
:Dados de amostra
Declaração do cursor
Loop de processamento
A conversão para
nvarchar(max)
deve funcionar, a menos que você esteja fazendo algo errado com o seuCHARINDEX()
Tente este trecho de código, ele deve gerar o que você deseja.
Obrigado a Andriy M por ajudar com a
REPLICATE
declaração.