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