alternatif untuk REPLACE pada tipe data teks atau ntext

101

Saya perlu memperbarui / mengganti data di datatable.column. Tabel tersebut memiliki bidang bernama Content. Saya menggunakan REPLACEfungsinya. Karena tipe data kolom adalah NTEXT, SQL Server tidak mengizinkan saya untuk menggunakan REPLACEfungsi tersebut.

Saya tidak dapat mengubah tipe data karena database ini adalah tabel perangkat lunak pihak ketiga. Mengubah tipe data akan menyebabkan aplikasi gagal.

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

Saya menerima kesalahan ini:

Msg 8116, Level 16, Status 1, Baris 1 Tipe data argumen ntext tidak valid untuk argumen 1 dari fungsi pengganti.

  • Bisakah saya memperbaikinya dengan T-SQL? Apakah seseorang memiliki contoh cara membaca dan mengulang?
  • Karena ini adalah konversi satu kali, mungkin saya dapat mengubah ke jenis lain tetapi saya khawatir saya mengacaukan data.

Ada bidang kunci utama: nama: ID - bilangan bulat - ini adalah identitas .... Jadi saya perlu memikirkan ini juga. Mungkin mengatur Identitas ke N sementara.

Mohon saran tentang bagaimana mencapai fungsi REPLACE?

Approx. 3000 pernyataan perlu diperbarui dengan solusi baru.

etem
sumber
Apakah ini SQL Server 2000?
p. Campbell
JAWABAN: Saya menggunakan SQL2008 ... dan DATABASE memiliki tingkat Kompatibilitas 2000 (80). Jika saya mengubahnya juga 2008 apakah itu akan berhasil? karena saya tidak tahu konsekuensinya saya tinggalkan pada tingkat kompatibilitas 2000, tetapi itu adalah Database SQL 2008. ini adalah konversi satu kali ...
ethem

Jawaban:

197

JIKA data Anda tidak melebihi 4000 karakter DAN Anda menggunakan SQL Server 2000 atau tingkat kompatibilitas 8 atau 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%' 

Untuk 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
sumber
3
Hanya pertanyaan singkat, apakah pemeran kedua NTextbenar-benar diperlukan? Menurut saya, penugasan NVarchar(MAX)ke NTextakan otomatis mentransmisikannya.
Tahir Hassan
3
Perbaikan sederhana yang bagus. Perhatikan bahwa 2005+ nvarchar (max) tidak memiliki batas 4000 karakter. Saya tahu itu sudah jelas (sekarang, bagi saya), tetapi pertama-tama saya membacanya seolah-olah kedua jawaban memiliki batas itu.
selamat tinggal
16

Dengan asumsi SQL Server 2000, pertanyaan StackOverflow berikut harus mengatasi masalah Anda.

Jika menggunakan SQL Server 2005/2008, Anda dapat menggunakan kode berikut (diambil dari sini ):

select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable
LittleBobbyTables - Au Revoir
sumber