Sql server 文本字段上的t-sql替换
我遇到了一个典型的问题,即需要在sql 2000数据库中的文本字段上执行字符串替换。这可以是整个专栏的更新,也可以是单个领域的更新,我并不挑剔 我发现了一些如何使用updatetext来实现它的示例,但它们往往在存储过程中,有人知道类似的东西被包装到函数中,以便我可以像通常使用Replace()一样使用它吗。对于任何不知道的人来说,Replace()函数的问题在于它不支持文本字段Sql server 文本字段上的t-sql替换,sql-server,sql-server-2000,Sql Server,Sql Server 2000,我遇到了一个典型的问题,即需要在sql 2000数据库中的文本字段上执行字符串替换。这可以是整个专栏的更新,也可以是单个领域的更新,我并不挑剔 我发现了一些如何使用updatetext来实现它的示例,但它们往往在存储过程中,有人知道类似的东西被包装到函数中,以便我可以像通常使用Replace()一样使用它吗。对于任何不知道的人来说,Replace()函数的问题在于它不支持文本字段 编辑:我意识到我可能可以摆脱varchar(8000),所以我将字段替换为这种类型,从而解决了这个问题。我从未找到一
编辑:我意识到我可能可以摆脱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进行验证这确实帮助我通过删除不需要的字符来快速更改一些名称。非常感谢您提供的解决方案。我已经找了好几个小时了。:)