альтернативи ЗАМІНІ на текстовий або ntext тип даних


101

Мені потрібно оновити / замінити дані в 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? Хтось має приклад, як читати та циклічно?
  • Оскільки це одноразове перетворення, можливо, я можу перейти на інший тип, але боюся, що я псую дані.

Існує поле первинного ключа: ім'я: ID - ціле число - це ідентичність .... Тому мені теж потрібно подумати над цим. Можливо, встановіть Identity на N тимчасовим.

Будь ласка, порадьте, як досягти функції ЗАМІНИ?

Прибл. 3000 заяв потрібно оновити новим рішенням.


Це SQL Server 2000?
p.campbell

ВІДПОВІДЬ: Я використовую SQL2008 ... і DATABASE має рівень сумісності 2000 (80). Якщо я теж зміню цей 2008 рік, чи буде це працювати? оскільки я не знаю наслідків, які поки я залишив на рівні сумісності 2000 року, але це база даних SQL 2008. це одноразове навернення ...
ethem

Відповіді:


197

Якщо ваші дані не переповнюватимуть 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буде автоматично кинь.
Тахір Хассан

3
Прекрасне просте виправлення. Лише зауважте, що nvarchar (max) 2005+ не має обмеження 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.