alternatywy dla REPLACE w typie danych text lub ntext

102

Muszę zaktualizować / zamienić dane w datatable.column. Tabela ma pole o nazwie Content. Używam REPLACEfunkcji. Ponieważ typ danych kolumny to NTEXT, SQL Server nie pozwala mi używać tej REPLACEfunkcji.

Nie mogę zmienić typu danych, ponieważ ta baza danych jest tabelą oprogramowania innej firmy. Zmiana typu danych spowoduje awarię aplikacji.

UPDATE [CMS_DB_test].[dbo].[cms_HtmlText] 
SET Content = REPLACE(Content,'ABC','DEF') 
WHERE Content LIKE '%ABC%' 

Otrzymuję ten błąd:

Msg 8116, poziom 16, stan 1, wiersz 1 Typ danych argumentu ntext jest nieprawidłowy dla argumentu 1 funkcji zamiany.

  • Czy mogę to naprawić za pomocą T-SQL? Czy ktoś ma przykład jak czytać i zapętlać?
  • Ponieważ jest to konwersja jednorazowa, może mogę zmienić typ na inny, ale obawiam się, że zepsuję dane.

Jest tam pole klucza podstawowego: nazwa: ID - liczba całkowita - to tożsamość ... Więc też muszę o tym pomyśleć. Może tymczasowo ustawić Tożsamość na N.

Proszę o poradę, jak uzyskać funkcję REPLACE?

Około. 3000 wyciągów wymaga aktualizacji o nowe rozwiązanie.

ethem
źródło
Czy to jest SQL Server 2000?
p.campbell
ODPOWIEDŹ: Używam SQL2008 ... a BAZA DANYCH ma poziom zgodności 2000 (80). Jeśli to też zmienię, to czy to się uda w 2008 roku? ponieważ nie znam konsekwencji, które zostawiłem na poziomie zgodności 2000, ale jest to baza danych SQL 2008. to jest jednorazowe nawrócenie ...
ethem

Odpowiedzi:

198

JEŚLI dane nie przekroczą 4000 znaków ORAZ korzystasz z programu SQL Server 2000 lub poziomu zgodności 8 lub programu 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%' 

W przypadku programu 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%' 
p.campbell
źródło
3
Tylko krótkie pytanie, czy druga obsada jest NTextnaprawdę konieczna? Myślę, że przypisanie NVarchar(MAX)do NTextautomatycznie spowoduje wysłanie.
Tahir Hassan
3
Świetna prosta poprawka. Tylko uwaga, że ​​nvarchar (max) 2005+ nie ma limitu 4000 znaków. Wiem, że to oczywiste (teraz dla mnie), ale najpierw przeczytałem to tak, jakby obie odpowiedzi miały ten limit.
goodeye
16

Zakładając, że SQL Server 2000, następujące pytanie StackOverflow powinno rozwiązać twój problem.

Jeśli używasz SQL Server 2005/2008, możesz użyć następującego kodu (zaczerpniętego stąd ):

select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable
LittleBobbyTables - Au Revoir
źródło