альтернативы REPLACE для типа данных text или ntext

102

Мне нужно обновить / заменить данные в 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 функции замены.

  • Могу я исправить это с помощью T-SQL? У кого-нибудь есть пример, как читать и зацикливать?
  • Поскольку это однократное преобразование, возможно, я смогу перейти на другой тип, но, боюсь, я испортил данные.

Есть поле первичного ключа: name: ID - integer - это личность .... Так что мне тоже нужно подумать об этом. Возможно, установите для параметра Identity значение N.

Посоветуйте, пожалуйста, как добиться функции ЗАМЕНИТЬ?

Прибл. 3000 заявлений необходимо обновить новым решением.

этем
источник
Это SQL Server 2000?
p.campbell
ОТВЕТ: Я использую SQL2008 ... и БАЗА ДАННЫХ имеет уровень совместимости 2000 (80). Если я тоже изменю это 2008, тогда он будет работать? поскольку я еще не знаю последствий, я оставил уровень совместимости 2000, но это база данных SQL 2008. это
разовое

Ответы:

198

ЕСЛИ ваши данные не превышают 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%' 
П. Кэмпбелл
источник
3
Небольшой вопрос, NTextдействительно ли необходимо второе применение ? Я думаю, что присвоение автоматически приведет NVarchar(MAX)к NTextего преобразованию.
Tahir Hassan
3
Отличное простое исправление. Просто обратите внимание, что nvarchar 2005+ (max) не имеет ограничения в 4000 символов. Я знаю, что это очевидно (теперь для меня), но сначала я прочитал это так, как если бы оба ответа имели этот предел.
goodeye
16

Предполагая, что SQL Server 2000, следующий вопрос StackOverflow должен решить вашу проблему.

Если вы используете SQL Server 2005/2008, вы можете использовать следующий код (взятый отсюда ):

select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable
LittleBobbyTables - Au Revoir
источник