2008-11-14 7 views
27

J'ai rencontré un problème classique de devoir remplacer une chaîne sur un champ de texte dans une base de données sql 2000. Cela pourrait être soit une mise à jour sur une colonne entière ou un seul champ que je ne suis pas difficile.t-sql remplacer sur le champ de texte

J'ai trouvé quelques exemples d'utilisation de updatetext pour y parvenir, mais ils ont tendance à être dans des procédures stockées, est-ce que quelqu'un connaît une chose similaire qui est enveloppée dans une fonction afin que je puisse l'utiliser Remplacer(). Le problème avec la fonction Replace() pour quiconque n'est pas au courant est qu'il ne supporte pas les champs de texte. Edit: Je me suis rendu compte que je pourrais probablement m'en sortir avec varchar (8000) alors j'ai troqué les champs vers ce type qui corrige le problème. Je n'ai jamais trouvé une vraie solution.

+0

Je pense que vous devez fournir plus de détails. Voulez-vous mettre à jour un seul champ d'une seule ligne? Quel est le problème avec replace() lui-même? – Jaywalker

+0

BTW, UPDATETEXT doit être supprimé d'une future version de SQL Server (> 2008) –

+0

consultez ma réponse man – JohnIdol

Répondre

3

Je crains que vous ne pouvez pas le faire dans une fonction

Lorsque vous essayez de déclarer une fonction comme:

create function dbo.textReplace(
@inText as text) 
returns text 
as 
begin 
    return 'a' -- just dummy code 
end 

Vous obtiendrez l'erreur suivante:

The text data type is invalid for return values. 

Dans d'autres mots que vous ne pouvez pas écrire un équivalent simple de la fonction REPLACE pour le type de données texte

+0

C'est vrai :(c'est pourquoi j'aime VARCHAR (MAX) dans SQL Server 2005 qui vous permet de faire toutes les fonctions VARCHAR sur une chaîne de 2gig: –

+1

Pour SQL 2005 et où vos données sont inférieures à 2 Go de longueur, voici une solution qui a fonctionné pour moi => http://stackoverflow.com/a/2641280/743 –

4

Ceci est mon extrait de code pour ce scénario:

DECLARE @oldtext varchar(1000) 
DECLARE @newtext varchar(1000) 
DECLARE @textlen int 
DECLARE @ptr  binary(16) 
DECLARE @pos  int 
DECLARE @id   uniqueidentifier 

SET @oldtext = 'oldtext' 
SET @newtext = 'newtext' 
SET @textlen = LEN(@oldtext) 

DECLARE mycursor CURSOR LOCAL FAST_FORWARD 
FOR 
    SELECT [UniqueID] 
      ,TEXTPTR([Text]) 
      ,CHARINDEX(@oldtext, [Text]) - 1 
    FROM [dbo].[myTable] 
    WHERE [Text] LIKE '%' + @oldtext +'%' 

OPEN mycursor 

FETCH NEXT FROM mycursor into @id, @ptr, @pos 

WHILE @@fetch_status = 0 
BEGIN 
    UPDATETEXT [dbo].[myTable].Text @ptr @pos @textlen @newtext 

    FETCH NEXT FROM mycursor into @id, @ptr, @pos 
END 

CLOSE mycursor 
DEALLOCATE mycursor 
1

Vous devez jeter le champ de texte à un varchar (8000) ou nvarchar (4000) si vous remplacez sur un champ ntext.

MyField = REMPLACER (CAST (MyField comme VARCHAR (4000)), "string1", "string2")

Cette ofcourse ne fonctionnera que si vous pouvez garantir le contenu du champ est < = 4000/8000 caractères de longueur.

1

Vous pouvez également utiliser la fonction SUBSTRING(), qui renvoie un varchar lors de la transmission d'une valeur de texte.

Par exemple:

MyVarchar = SUBSTRING(myTextField, 1, DATALENGTH(myTextField)) 

Si vous alimenter une varchar avec une longueur spécifique, vous pouvez tronquer pour s'adapter:

MyVarchar100 = SUBSTRING(myTextField, 1, 100) 
45

Voici l'exemple de requête pour mettre à jour la table avec colonne de texte en utilisant la fonction REPLACE. J'espère que c'est utile pour vous.

UPDATE <Table> set textcolumn= 
REPLACE(SUBSTRING(textcolumn,1,DATALENGTH(textcolumn)),'findtext','replacetext') 
WHERE <Condition> 
+11

Avertissement: la sous-chaîne renvoie varchar et va tronquer à 8000 caractères (4000 pour ntext) tout comme les autres fonctions de chaîne.Vérifiez avec SELECT DATALENGTH (textcolumn), DATALENGTH (sous-chaîne (textcolumn, 1, DATALENGTH (textcolumn))) – Jerph

+3

@suryakiran Cela m'a vraiment aidé à changer rapidement certains noms en supprimant les caractères indésirables. Merci –

+0

Merci beaucoup pour cette solution. Je cherchais des heures. :) –

Questions connexes