t-sql remplacer sur le champ de texte

j'ai frappé un problème classique de devoir faire un remplacement de chaîne de caractères 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 Je ne suis pas difficile.

j'ai trouvé quelques exemples de comment utiliser updatetext pour l'atteindre, mais ils ont tendance à être dans des procédures stockées, personne ne sait d'une chose semblable qui est encapsulé dans une fonction donc je peux l'utiliser comme j'avais l'habitude de l'utilisation de replace(). Le problème avec la fonction de remplacement() pour toute personne qui n'est pas au courant, c'est qu'il ne prend pas en charge les champs de texte.

Edit: j'ai réalisé que je pouvais probablement m'en sortir avec varchar(8000) donc j'ai changé les champs à ce type qui corrige le problème. Je n'ai jamais trouvé de VRAIE solution.

28
demandé sur PeteT 2008-11-14 13:13:48

5 réponses

je crains que vous ne puissiez pas le faire dans une fonction

quand 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 recevez l'erreur suivante:

The text data type is invalid for return values.

en d'autres termes, vous ne pouvez pas écrire un équivalent simple de remplacer la fonction pour le type de données de texte

3
répondu kristof 2008-11-14 11:11:49

Voici l'exemple de requête pour mettre à jour la table avec la colonne de texte en utilisant la fonction de remplacement. Espérons que cela est utile pour vous.

UPDATE <Table> set textcolumn=
REPLACE(SUBSTRING(textcolumn,1,DATALENGTH(textcolumn)),'findtext','replacetext') 
WHERE <Condition>
46
répondu suryakiran 2011-02-07 12:47:52

voici 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
4
répondu bitsprint 2008-11-20 08:32:56

vous devriez lancer le champ de texte à un varchar(8000) ou nvarchar(4000) si vous remplacez sur un champ ntext.

MyField = REPLACE (CAST (MyField as VARCHAR (4000)), "string1", "string2")

Ceci bien sûr ne fonctionnera que si vous pouvez garantir le contenu dans le champ <= 4000/8000 caractères.

1
répondu Craig Bovis 2009-02-16 00:29:44

vous pouvez également utiliser la fonction SUBSTRING (), qui renvoie une varchar lorsque vous passez une valeur texte.

Par exemple:

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

si vous peuplez un varchar avec une longueur spécifique, vous pouvez tronquer pour s'adapter:

MyVarchar100 = SUBSTRING(myTextField, 1, 100)
1
répondu Seth Petry-Johnson 2009-08-13 19:22:00