alternativas para REPLACE em um tipo de dados text ou ntext

101

Preciso atualizar / substituir os dados em datatable.column. A tabela possui um campo denominado Content. Estou usando a REPLACEfunção. Como o tipo de dados da coluna é NTEXT, o SQL Server não me permite usar a REPLACEfunção.

Não consigo alterar o tipo de dados porque este banco de dados é uma tabela de software de terceiros. Alterar o tipo de dados fará com que o aplicativo falhe.

UPDATE [CMS_DB_test].[dbo].[cms_HtmlText] 
SET Content = REPLACE(Content,'ABC','DEF') 
WHERE Content LIKE '%ABC%' 

Recebo este erro:

Msg 8116, Nível 16, Estado 1, Linha 1 Tipo de dados de argumento ntext é inválido para o argumento 1 da função de substituição.

  • Posso consertar isso com o T-SQL? Alguém tem um exemplo de como ler e fazer um loop?
  • Como esta é uma conversão única, talvez eu possa mudar para outro tipo, mas infelizmente estou bagunçando os dados.

Há um campo de chave primária: nome: ID - inteiro - é uma identidade ... Portanto, preciso pensar sobre isso também. Talvez defina a identidade para N temporário.

Por favor, aconselhe sobre como conseguir a função REPLACE?

Aproximadamente. 3.000 declarações precisam ser atualizadas com uma nova solução.

ethem
fonte
Este é o SQL Server 2000?
p.campbell
RESPOSTA: Estou usando SQL2008 ... e o DATABASE tem nível de compatibilidade 2000 (80). Se eu mudar isso também em 2008, isso funcionará? como ainda não sei as consequências saí no nível de compatibilidade 2000, mas é SQL 2008 Database. esta é uma conversão única ...
ethem

Respostas:

197

SE seus dados não estourarem 4.000 caracteres E você estiver no SQL Server 2000 ou nível de compatibilidade 8 ou SQL Server 2000:

UPDATE [CMS_DB_test].[dbo].[cms_HtmlText] 
SET Content = CAST(REPLACE(CAST(Content as NVarchar(4000)),'ABC','DEF') AS NText)
WHERE Content LIKE '%ABC%' 

Para SQL Server 2005+:

UPDATE [CMS_DB_test].[dbo].[cms_HtmlText] 
SET Content = CAST(REPLACE(CAST(Content as NVarchar(MAX)),'ABC','DEF') AS NText)
WHERE Content LIKE '%ABC%' 
p.campbell
fonte
3
Só uma pergunta rápida, o segundo elenco é NTextrealmente necessário? Eu acho que atribuir NVarchar(MAX)a o NTextlançaria automaticamente.
Tahir Hassan de
3
Ótima solução simples. Apenas uma observação que o nvarchar (máximo) de 2005+ não tem limite de 4000 caracteres. Eu sei que é óbvio (agora, para mim), mas primeiro li como se ambas as respostas tivessem esse limite.
goodeye
16

Assumindo o SQL Server 2000, a seguinte questão StackOverflow deve resolver seu problema.

Se estiver usando o SQL Server 2005/2008, você pode usar o seguinte código (retirado daqui ):

select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable
LittleBobbyTables - Au Revoir
fonte