Альтернативы REPLACE в текстовом или ntext-типе данных
Мне нужно обновить/заменить данные в datatable.column. В таблице указано поле с именем Content
. Я использую функцию REPLACE
. Поскольку тип данных столбца NTEXT
, SQL Server не позволяет мне использовать функцию REPLACE
.
Я не могу изменить тип данных, потому что эта база данных является сторонней таблицей программного обеспечения. Изменение типа данных приведет к сбою приложения.
UPDATE [CMS_DB_test].[dbo].[cms_HtmlText]
SET Content = REPLACE(Content,'ABC','DEF')
WHERE Content LIKE '%ABC%'
Получаю эту ошибку:
Msg 8116, уровень 16, состояние 1, строка 1 Тип аргумента ntext недопустим для аргумента 1 функции replace.
- Можно ли исправить это с помощью T-SQL? Есть ли у кого-нибудь пример, как читать и цитировать?
- Так как это одноразовое преобразование, возможно, я могу перейти на другой тип, но я боюсь, что я испортил данные.
Существует поле первичного ключа: name: ID - integer - это идентификатор... Поэтому мне тоже нужно подумать об этом. Может быть, установите идентификатор в N временным.
Пожалуйста, сообщите, как выполнить функцию REPLACE?
Прибл. 3000 необходимо обновить с помощью нового решения.
Ответы
Ответ 1
IF ваши данные не переполнят 4000 символов И на SQL Server 2000 или на уровне совместимости 8 или SQL Server 2000:
UPDATE [CMS_DB_test].[dbo].[cms_HtmlText]
SET Content = CAST(REPLACE(CAST(Content as NVarchar(4000)),'ABC','DEF') AS NText)
WHERE Content LIKE '%ABC%'
Для SQL Server 2005 +:
UPDATE [CMS_DB_test].[dbo].[cms_HtmlText]
SET Content = CAST(REPLACE(CAST(Content as NVarchar(MAX)),'ABC','DEF') AS NText)
WHERE Content LIKE '%ABC%'
Ответ 2
Предполагая, что SQL Server 2000, следующий fooobar.com/questions/29127/... должен решить вашу проблему.
Если вы используете SQL Server 2005/2008, вы можете использовать следующий код (взятый из здесь):
select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable
Ответ 3
Хорошая статья об этой проблеме:
http://www.sidesofmarch.com/index.php/archive/2008/02/27/how-to-use-replace-within-ntext-columns-in-sql-server/
Вы должны использовать переменную ntext.
select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable