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.
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
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>
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
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)
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.