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