các lựa chọn thay thế để THAY THẾ trên kiểu dữ liệu văn bản hoặc ntext


101

Tôi cần cập nhật / thay thế dữ liệu trong datatable.column. Bảng có một trường được đặt tên Content. Tôi đang sử dụng REPLACEchức năng. Vì là kiểu dữ liệu cột NTEXT, nên SQL Server không cho phép tôi sử dụng REPLACEhàm.

Tôi không thể thay đổi kiểu dữ liệu vì cơ sở dữ liệu này là bảng phần mềm của bên thứ ba. Thay đổi kiểu dữ liệu sẽ khiến ứng dụng bị lỗi.

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

Tôi nhận được lỗi này:

Msg 8116, Mức 16, Trạng thái 1, Dòng 1 Kiểu dữ liệu đối số ntext không hợp lệ cho đối số 1 của hàm thay thế.

  • Tôi có thể sửa lỗi này bằng T-SQL không? Ai đó có một ví dụ về cách đọc và lặp lại?
  • Vì đây là chuyển đổi một lần, có lẽ tôi có thể đổi sang loại khác nhưng tôi sợ rằng tôi đang làm rối tung dữ liệu.

Có một trường khóa chính: tên: ID - số nguyên - đó là danh tính .... Vì vậy, tôi cũng cần phải suy nghĩ về điều này. Có thể đặt Identity thành N tạm thời.

Xin tư vấn về cách đạt được hàm REPLACE?

Khoảng 3000 câu lệnh cần được cập nhật với một giải pháp mới.


Đây có phải là SQL Server 2000 không?
p.campbell

TRẢ LỜI: Tôi đang sử dụng SQL2008 ... và CƠ SỞ DỮ LIỆU có mức Tương thích 2000 (80). Nếu tôi cũng thay đổi điều này trong năm 2008 thì nó có hoạt động không? vì tôi không biết hậu quả nên tôi đã để lại ở mức tương thích 2000, nhưng đó là Cơ sở dữ liệu SQL 2008. đây là chuyển đổi một lần ...
ethem

Câu trả lời:


197

NẾU dữ liệu của bạn không tràn 4000 ký tự bạn đang sử dụng SQL Server 2000 hoặc mức độ tương thích 8 hoặc 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%' 

Đối với 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
Chỉ cần một câu hỏi nhanh, dàn diễn viên thứ hai có NTextthực sự cần thiết không? Tôi nghĩ rằng việc gán NVarchar(MAX)cho NTextsẽ tự động truyền nó.
Tahir Hassan

3
Sửa chữa đơn giản tuyệt vời. Chỉ cần lưu ý rằng 2005+ nvarchar (tối đa) không có giới hạn 4000 ký tự. Tôi biết điều đó là hiển nhiên (bây giờ, đối với tôi), nhưng lần đầu tiên tôi đọc nó như thể cả hai câu trả lời đều có giới hạn đó.
goodeye

16

Giả sử SQL Server 2000, câu hỏi StackOverflow sau sẽ giải quyết vấn đề của bạn.

Nếu sử dụng SQL Server 2005/2008, bạn có thể sử dụng mã sau (lấy từ đây ):

select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.