31

我遇到了一个需要对 sql 2000 数据库中的文本字段进行字符串替换的经典问题。这可能是对整个专栏的更新,也可能是我不挑剔的单个字段。

我找到了一些如何使用 updatetext 来实现它的示例,但它们往往在存储过程中,有没有人知道类似的东西被包装到一个函数中,所以我可以像通常使用 Replace() 一样使用它。对于任何不知道的人来说,Replace() 函数的问题是它不支持文本字段。

编辑:我意识到我可能会摆脱 varchar(8000) 因此已将字段交换为解决问题的这种类型。我从来没有找到真正的解决方案。

4

5 回答 5

52

这是使用 REPLACE 函数使用文本列更新表的示例查询。希望这对你有用。

UPDATE <Table> set textcolumn=
REPLACE(SUBSTRING(textcolumn,1,DATALENGTH(textcolumn)),'findtext','replacetext') 
WHERE <Condition>
于 2009-10-26T08:52:18.383 回答
4

恐怕你不能在一个函数中做到这一点

当您尝试声明如下函数时:

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

您将收到以下错误:

The text data type is invalid for return values.

换句话说,您不能为文本数据类型编写一个简单的 REPLACE 函数等价物

于 2008-11-14T11:11:49.453 回答
4

这是我在这种情况下的代码片段:

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
于 2008-11-20T08:32:56.697 回答
1

如果要替换 ntext 字段,则必须将文本字段转换为 varchar(8000) 或 nvarchar(4000)。

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

这当然只有在您可以保证字段中的内容长度 <= 4000/8000 个字符的情况下才有效。

于 2009-02-16T00:29:44.963 回答
1

您还可以使用 SUBSTRING() 函数,该函数在传递文本值时返回 varchar。

例如:

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

如果要填充具有特定长度的 varchar,则可以截断以适应:

MyVarchar100 = SUBSTRING(myTextField, 1, 100)
于 2009-08-13T19:22:00.147 回答