web-dev-qa-db-fra.com

t-sql replace sur le champ de texte

J'ai rencontré un problème classique de devoir faire un remplacement de chaîne sur un champ de texte dans une base de données SQL 2000. Cela pourrait être une mise à jour sur une colonne entière ou un seul champ, je ne suis pas difficile.

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 comme j'utiliserais habituellement Replace (). Le problème avec la fonction Replace () pour ceux qui ne le savent pas, c'est qu'elle ne prend pas en charge les champs de texte.

Edit: J'ai réalisé que je pouvais probablement m'en tirer avec varchar (8000), j'ai donc échangé les champs vers ce type, ce qui résout le problème. Je n'ai jamais trouvé de vraie solution.

29
PeteT

Je crains que vous ne puissiez 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.

En d'autres termes, vous ne pouviez pas écrire un équivalent simple de la fonction REMPLACER pour le type de données texte

3
kristof

Voici l'exemple de requête pour mettre à jour le tableau avec la colonne de texte à l'aide de la fonction REPLACE. J'espère que cela vous sera utile.

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

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
bitsprint

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

Par exemple:

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

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

MyVarchar100 = SUBSTRING(myTextField, 1, 100)
1
Seth Petry-Johnson

Vous devrez convertir le champ de texte en varchar (8000) ou nvarchar (4000) si vous remplacez un champ ntext.

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

Bien sûr, cela ne fonctionnera que si vous pouvez garantir que le contenu du champ est <= 4000/8000 caractères.

1
Craig Bovis