t-sql替换文本字段

时间:2008-11-14 10:13:49

标签: sql-server sql-server-2000

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

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

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

5 个答案:

答案 0 :(得分:48)

以下是使用REPLACE函数更新带有text列的表的示例查询。希望这对你有用。

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

答案 1 :(得分: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

答案 2 :(得分:3)

我担心你不能在一个功能中做到这一点

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

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函数等效项

答案 3 :(得分:1)

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

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

如果您可以保证字段中的内容长度为&lt; = 4000/8000个字符,则此操作仅适用。

答案 4 :(得分:1)

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

例如:

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

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

MyVarchar100 = SUBSTRING(myTextField, 1, 100)