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

101

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

Je ne peux pas changer le type de données car cette base de données est une table de logiciels tiers. La modification du 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 de remplacement.

  • Puis-je résoudre ce problème avec T-SQL? Quelqu'un a-t-il un exemple de lecture et de boucle?
  • Comme il s'agit d'une conversion unique, je peux peut-être changer de type, mais j'ai peur de gâcher les données.

Il y a un champ de clé primaire: nom: ID - entier - c'est une identité .... Je dois donc y penser aussi. Peut-être définir l'identité sur N temporaire.

Veuillez indiquer comment réaliser la fonction REMPLACER?

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

ethem
la source
S'agit-il de SQL Server 2000?
p.campbell
RÉPONSE: J'utilise SQL2008 ... et la BASE DE DONNÉES a le niveau de compatibilité 2000 (80). Si je change cela aussi 2008, cela fonctionnera-t-il? puisque je ne connais pas encore les conséquences je suis parti au niveau de compatibilité 2000, mais c'est SQL 2008 Database. c'est une conversion de temps ...
ethem

Réponses:

197

SI vos données ne débordent pas de 4000 caractères ET que vous utilisez SQL Server 2000 ou un 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%' 
p.campbell
la source
3
Juste une petite question, le second casting est-il NTextvraiment nécessaire? Je pense qu'assigner NVarchar(MAX)à le NTextferait automatiquement.
Tahir Hassan
3
Excellente solution simple. Juste une note que le nvarchar (max) 2005+ n'a pas de limite de 4000 caractères. Je sais que c'est évident (maintenant, pour moi), mais je l'ai d'abord lu comme si les deux réponses avaient cette limite.
revoir le
16

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

Si vous utilisez SQL Server 2005/2008, vous pouvez utiliser le code suivant (extrait d' ici ):

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