SqlServer數(shù)據(jù)庫長文本和二進(jìn)制字段操作總結(jié)(54powerman原創(chuàng))
--創(chuàng)建測試用表
Create?Table?TestnText?(RowID?Int?Identity(1,1)?Primary?Key,Content?nText)
--讀寫nText文本,一定要用在事物中
Begin?Tran
DECLARE?@ptrval?varbinary(16)
Select?@ptrval=TEXTPTR(content)?From?TestnText?Where?RowID=1
--TEXTPTR函數(shù)以?varbinary?格式返回對應(yīng)于?text、ntext?或?image?列的文本指針值。檢索到的文本指針值可用于?READTEXT、WRITETEXT?和?UPDATETEXT?語句。
Select?RowID,DATALENGTH(Content)?From?TestnText
--要獲取Content內(nèi)容的長度要使用DATALENGTH函數(shù)來獲取,結(jié)果為字節(jié)數(shù)
--要使用行文本指針,先獲得指針
ReadText?TestnText.Content?@ptrval?1?10?
--第一個參數(shù)為字段,一定要用表名限制字段,
--第三個參數(shù)是開始讀取?text、image?或?ntext?數(shù)據(jù)之前跳過的字節(jié)數(shù),如果從開始選擇為0
--第四個參數(shù)是選擇的長度。是要讀取數(shù)據(jù)的字節(jié)數(shù)(使用?text?或?image?數(shù)據(jù)類型時)或字符數(shù)(使用?ntext?數(shù)據(jù)類型時)。
--第五個參數(shù)可選,若值為HOLDLOCK,則表明使文本值一直鎖定到事務(wù)結(jié)束。其他用戶可以讀取該值,但是不能對其進(jìn)行修改。
SET?TEXTSIZE?5
--如果此時指定TextSize則會限制以后的讀取
ReadText?TestnText.Content?@ptrval?1?10?
--由于上面指定了TextSize,所以此時返回了少于10個字節(jié)的數(shù)據(jù),而只返回了5個字節(jié)
WriteText?TestnText.Content?@ptrval?'請使用?WRITETEXT?來替換?text、ntext?和?image?數(shù)據(jù),而用?UPDATETEXT?來修改?text、ntext?和?image?數(shù)據(jù)。UPDATETEXT?更靈活,因為它僅更改?text、ntext?或?image?列的某一部分,而不是整個列。如果數(shù)據(jù)庫恢復(fù)模型簡單或有大容量日志記錄,則?WRITETEXT?是無日志記錄的操作。這就意味著在將?text、ntext?或?image?數(shù)據(jù)寫入數(shù)據(jù)庫時,不會進(jìn)行日志記錄;因此,事務(wù)日志不會填滿大量通常由這些數(shù)據(jù)類型組成的數(shù)據(jù)。為使?WRITETEXT?正常工作,列必須已經(jīng)包含有效的文本指針。?如果該表沒有行內(nèi)文本,則在通過?INSERT?向?text?列中放入顯式或隱式空值時,SQL?Server?不初始化?text?列,從而節(jié)省了空間,而且不能獲取這類空值的文本指針。若要將?text?列初始化為?NULL,請使用?UPDATE?語句。如果該表有行內(nèi)文本,就沒有必要為空值初始化文本列,而且您始終可以獲取文本指針。與?WRITETEXT?相比,DB-Library?dbwritetext?和?dbmoretext?函數(shù)以及?ODBC?SQLPutData?函數(shù)速度較快且使用的動態(tài)內(nèi)存較少。這些函數(shù)可以插入多達(dá)?2G?字節(jié)的?text、ntext?或?image?數(shù)據(jù)。'
--第三個參數(shù)是要寫入的文本,
Set?TextSize?0
--釋放前面設(shè)定的TextSize設(shè)置
ReadText?TestnText.Content?@ptrval?0?100
UpdateText?TestnText.Content?@ptrval?3?1?'不要使'
--第三個參數(shù)是以零為基的更新起始位置,或者說是插入數(shù)據(jù)的位置。
--第四個參數(shù)是是從?insert_offset?位置開始的、要從現(xiàn)有?text、ntext?或?image?列中刪除的數(shù)據(jù)長度,或者要用新數(shù)據(jù)替換掉的數(shù)據(jù)長度。
ReadText?TestnText.Content?@ptrval?0?100
Select?PATINDEX('%使用%',?Content)?From?TestnText
Commit
/*
常用的函數(shù):
PATINDEX('%pattern%',?expression)?返回給定字符串在?text?或?ntext?列中的字符位置。??
DATALENGTH(expression)?返回?text、ntext?和?image?列的數(shù)據(jù)長度。??
SET?TEXTSIZE?返回可用?SELECT?語句返回的?text、ntext?或?image?數(shù)據(jù)的極限大小(以字節(jié)為單位)。?
SUBSTRING(text_column,?start,?length)?返回由給定?start?偏移量和?length?所指定的?varchar?字符串。此長度應(yīng)小于?8?KB。?
TEXTVALID('table.column',text_ptr)一個?text、ntext?或?image?函數(shù),用于檢查給定文本指針是否有效。
*/