Sql server 文本字段上的t-sql替换

Sql server 文本字段上的t-sql替换,sql-server,sql-server-2000,Sql Server,Sql Server 2000,我遇到了一个典型的问题,即需要在sql 2000数据库中的文本字段上执行字符串替换。这可以是整个专栏的更新,也可以是单个领域的更新,我并不挑剔 我发现了一些如何使用updatetext来实现它的示例,但它们往往在存储过程中,有人知道类似的东西被包装到函数中,以便我可以像通常使用Replace()一样使用它吗。对于任何不知道的人来说,Replace()函数的问题在于它不支持文本字段 编辑:我意识到我可能可以摆脱varchar(8000),所以我将字段替换为这种类型,从而解决了这个问题。我从未找到一

我遇到了一个典型的问题,即需要在sql 2000数据库中的文本字段上执行字符串替换。这可以是整个专栏的更新,也可以是单个领域的更新,我并不挑剔

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


编辑:我意识到我可能可以摆脱varchar(8000),所以我将字段替换为这种类型,从而解决了这个问题。我从未找到一个真正的解决方案。

恐怕您无法在函数内完成这项工作

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

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函数

这是我在此场景中的代码片段:

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

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

MyField=REPLACE(将MyField转换为VARCHAR(4000)),“string1”,“string2”)


当然,只有在可以保证字段中的内容是的情况下,才能使用SUBSTRING()函数,该函数在传递文本值时返回varchar

例如:

MyVarchar = SUBSTRING(myTextField, 1, DATALENGTH(myTextField))
如果要使用特定长度填充varchar,可以截断以适应:

MyVarchar100 = SUBSTRING(myTextField, 1, 100)

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

UPDATE <Table> set textcolumn=
REPLACE(SUBSTRING(textcolumn,1,DATALENGTH(textcolumn)),'findtext','replacetext') 
WHERE <Condition>
更新集文本列=
替换(子字符串(textcolumn,1,DATALENGTH(textcolumn)),'findtext','replacetext')
哪里

我认为您需要提供更多详细信息。是否要更新单行的单个字段?replace()本身有什么问题?顺便说一句,UPDATETEXT将从SQL Server(>2008)For SQL 2005的未来版本中删除,如果您的数据长度小于2GB,这里有一个对我有效的解决方案=>这是真的:(…这就是我喜欢VARCHAR(MAX)的原因)在SQL Server 2005中,允许您在2gig长度字符串上执行所有VARCHAR函数:)对于SQL 2005,如果您的数据长度小于2GB,则有一个解决方案适用于我=>警告:substring返回VARCHAR,并将像其他字符串函数一样截断为8000个字符(ntext为4000个)。使用selectdatalength(textcolumn)、DATALENGTH(substring(textcolumn,1,DATALENGTH(textcolumn))@suryakiran进行验证这确实帮助我通过删除不需要的字符来快速更改一些名称。非常感谢您提供的解决方案。我已经找了好几个小时了。:)