web-dev-qa-db-fra.com

alternatives à REPLACE sur un type de données text ou ntext

Je dois mettre à jour/remplacer les données dans datatable.column. La table a un champ nommé Content. J'utilise la fonction REPLACE. Étant donné que le type de données de la colonne est NTEXT, SQL Server ne me permet pas d'utiliser la fonction REPLACE.

Je ne peux pas changer le type de données car cette base de données est une table logicielle tierce. Changer le type de données entraînera l'échec de l'application.

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

Je reçois cette erreur:

Msg 8116, niveau 16, état 1, ligne 1 Le type de données d'argument ntext n'est pas valide pour l'argument 1 de la fonction replace.

  • Puis-je résoudre ce problème avec T-SQL? Est-ce que quelqu'un a un exemple comment lire et faire une boucle?
  • Puisqu'il s'agit d'une conversion unique, je peux peut-être changer de type mais je crains de perdre les données.

Il existe un champ de clé primaire: nom: ID - entier - c’est une identité ... Il faut donc que je réfléchisse à cela aussi. Peut-être définir l'identité sur N temporaire.

S'il vous plaît donner des conseils sur la façon de réaliser la fonction REPLACE?

Environ. 3000 déclarations doivent être mises à jour avec une nouvelle solution.

90
ethem

SI vos données ne déborderont pas de 4000 caractères ET vous êtes sur SQL Server 2000 ou niveau de compatibilité de 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%' 

Pour 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%' 
185
p.campbell

En supposant que SQL Server 2000, la question suivante question StackOverflow devrait résoudre votre problème.

Si vous utilisez SQL Server 2005/2008, vous pouvez utiliser le code suivant (tiré de here ):

select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable
15
LittleBobbyTables