Sqlserver 報錯“參數數據類型 ntext/text 對於 replace 函數的參數 1 無效”的解決方案及原理分析擴展


原因:在數據查詢中replace函數無法對表table中text/ntext類型的字段colname進行了字符串操作。

解決方法:將text當作varchar(實際內容長度低於8000字節時)或把ntext當作nvarchar(實際內容長度低於4000字節時)。

但是當text字段內容長度超過8000或ntext字段內容長度超過4000字節時多出的字節會被截斷而忽略掉。

這時我們可以使用max類型來解決這個問題。

原報錯代碼:

update tablename set colname=replace(colname,'oldtext','newtext'); 

修改后可執行代碼:

update tablename set colname=replace(Cast(colname as varchar(8000)),'oldtext','newtext');
update tablename set colname=replace(Cast(colname as nvarchar(4000)),'oldtext','newtext');

附:max類型的介紹 
varchar(max)、nvarchar(max) 和 varbinary(max) 統稱為大值數據類型。可以使用大值數據類型來存儲最大為 2^31-1 個字節的數據。 
max 說明符是在Microsoft SQL Server 2005 中引入的。此說明符增強了 varchar、nvarchar 和 varbinary 數據類型的存儲能力。

當 sp_tableoption 存儲過程的 ‘large value types out of row’ 選項設置為 OFF 時,大值類型的行內存儲限制為 8000 個字節。當此選項設置為 ON 時,只在行內存儲 16 字節的根。可查找參考關於sp_tableoption (Transact-SQL)的內容。

大值數據類型在行為上和與之對應的較小的數據類型 varchar、nvarchar 和 varbinary 相似。這種相似使 SQL Server 能夠更高效地存儲和檢索大型字符、Unicode 和二進制數據。

因為有了大值數據類型,使一些使用 SQL Server 的方式是使用早期版本的 SQL Server 中的 text、ntext 和 image 數據類型所沒有的。例如,在 SQL Server 2005 中,您可以定義能存儲大量數據(最多可達 2^31 字節的字符、整數和 Unicode 數據)的變量。可查找參考關於Transact-SQL 變量的內容。 
Transact-SQL 變量示例: 
DECLARE @MyURL nvarchar(2000); 
set @MyURL=’https://www.cnblogs.com/NeilShieh/‘;

下面是大值數據類型和 SQL Server 早期版本(如SQL 2000)中與之對應的數據類型之間的關系。

大值數據類型       早期版本中的 LOB 
varchar(max)     text* 
nvarchar(max)     ntext* 
varbinary(max)       image

SQL Server 6.5 版本的客戶端不支持 ntext 數據類型,因此無法識別 nvarchar(max)。

在SQL 2005中請使用 varchar(max)、nvarchar(max) 和 varbinary(max) 數據類型,而不要使用 text、ntext 和 image 數據類型。

大值數據類型在行為上和與之對應的較小的數據類型 varchar(n)、nvarchar(n) 和 varbinary(n) 相同。下面介紹大值數據類型在某些特定情形下的使用:

游標 
由於可以定義大值數據類型變量,便可以將 FETCH 返回的大值數據類型列中的數據賦給本地變量。可查找參考關於 FETCH (Transact-SQL)的內容。 
使用大值數據類型不影響游標的強制實施游標類型轉換用法。

成塊更新 
UPDATE 語句現在支持 .WRITE( ) 子句對基礎大值數據列進行部分更新。這類似於 SQL Server 早期版本中所支持的對 text、ntext、image 數據類型的文本指針操作、WRITETEXT 和 UPDATETEX。可查找參考關於UPDATE (Transact-SQL)的內容。

觸發器 
支持對插入的和刪除的表中的大值數據類型列引用上使用 AFTER 觸發器。可查找參考關於CREATE TRIGGER (Transact-SQL)的內容。

字符串函數 
內置的可操作字符和二進制數據的字符串函數有所增強,可支持大值數據類型的參數。這些函數包括: 
COL_LENGTH 
CHARINDEX 
PATINDEX 
LEN 
DATALENGTH 
SUBSTRING


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM