<b>SQL Server中圖像資料的存儲機制</b>
<b></b> 在MIS SQL Server 中,對于小于 8000 個位元組的資料能用二進制型(binary、varbinary)來表示。但通常要儲存的一些醫學影像圖檔都會大于 8000個位元組。SQL Server提供了一種機制,能存儲每行大到 2GB的二進制對象(BLOB),這類對象可包括image、text和ntext三種資料類型。Image資料類型存儲的是二進制資料,最大長度是 231-1 (2,147,483,647)個位元組。
BLOB資料在MIS SQL Server系統中的存儲方式不同于普通的資料類型,對于普通類型的資料系統直接在使用者定義的字段上存儲資料值,而對于BLOB類型資料,系統開辟新的存儲頁面來存放這些資料,表中BLOB類型資料字段存放的僅是個16個位元組的指針,該指針指向存放該條記錄的BLOB資料的頁面。
<b>SQL Server中圖像資料的存取</b>
在MIS SQL Server中,當資料小于 8000 個位元組時,能用普通的SQL操縱語句(SELECT、INSERT、UPDATE、DELETE)來完成對字段的操縱,當資料大于8000個位元組時,SQL提供了 WRITETEXT 、READTEXT和UPDATETEXT這三個函數來讀取和修改資料。這三個函數的使用方法為:
(1) WRITETEXT {table.column text_ptr}[WITH LOG] {data}
table.column為表中的字段,text_ptr為一個16個位元組的指針,data為要寫的資料值。可選參數WITH LOG表示是否要寫入日志檔案中。
READTEXT讀取 <b>text</b>、<b>ntext</b> 或 <b>image</b> 列中的 <b>text</b>、<b>ntext</b> 或 <b>image</b> 值,從指定的偏移量開始讀取指定的位元組數。
文法READTEXT { table<b>.</b>column text_ptr offset size }[ HOLDLOCK ]
參數table<b>.</b>column
是從中讀取的表和列的名稱。表名和列名必須符合辨別符的規則。必須指定表名和列名,不過可以選擇是否指定資料庫名稱和所有者名稱。
text_ptr
有效文本指針。text_ptr 必須是 <b>binary(16)</b>。
offset
開始讀取 <b>text</b>、<b>image</b> 或 <b>ntext</b> 資料之前跳過的位元組數(使用 <b>text </b>或 <b>image </b>資料類型時)或字元數(使用 <b>ntext </b>資料類型時)。使用 <b>ntext </b>資料類型時,offset 是在開始讀取資料前跳過的字元數。使用 <b>text </b>或 <b>image </b>資料類型時,offset 是在開始讀取資料前跳過的位元組數。
size
是要讀取資料的位元組數(使用 <b>text </b>或 <b>image </b>資料類型時)或字元數(使用 <b>ntext </b>資料類型時)。如果 size 是 0,則表示讀取了 4 KB 位元組的資料。
HOLDLOCK
使文本值一直鎖定到事務結束。其他使用者可以讀取該值,但是不能對其進行修改。
UPDATETEXT更新現有 <b>text</b>、<b>ntext</b> 或 <b>image</b>字段。使用 UPDATETEXT 在适當的位置更改 <b>text</b>、<b>ntext</b> 或 <b>image</b>列的一部分。使用 WRITETEXT 來更新和替換整個 <b>text</b>、<b>ntext</b> 或 <b>image</b>字段。
文法UPDATETEXT { table_name<b>.</b>dest_column_name dest_text_ptr }
{ NULL | insert_offset }
{ NULL | delete_length }
[ WITH LOG ]
[ inserted_data
| { table_name<b>.</b>src_column_name src_text_ptr }
參數table_name<b>.</b>dest_column_name
要更新的表和 <b>text</b>、<b>ntext</b> 或 <b>image</b> 列的名稱。表名和列名必須符合辨別符的規則。有關更多資訊,請參見。指定資料庫名和所有者名是可選的。
dest_text_ptr
指向要更新的 <b>text</b>、<b>ntext</b> 或 <b>image</b> 資料的文本指針的值(由 TEXTPTR 函數傳回)。dest_text_ptr 必須為 <b>binary(16)</b>。
insert_offset
以零為基的更新起始位置。對于 <b>text</b> 或 <b>image</b> 列,insert_offset 是在插入新資料前從現有列的起點開始要跳過的位元組數對于 <b>ntext</b> 列,insert_offset 是字元個數(每個 <b>ntext</b> 字元占用 2 個位元組)。開始于這個以零為基的起始點的現有 <b>text</b>、<b>ntext </b>或 <b>image</b> 資料向右移,為新資料騰出空間。值為 0 表示将新資料插入到現有位置的開始處。值為 NULL 則将新資料追加到現有資料值中。
delete_length
是從 insert_offset 位置開始的、要從現有 <b>text</b>、<b>ntext </b>或 <b>image</b> 列中删除的資料長度。delete_length 值對于 <b>text</b> 和 <b>image</b> 列用位元組指定,對于 <b>ntext</b> 列用字元指定。每個 <b>ntext</b> 字元占用 2 個位元組。值為 0 表示不删除資料。值為 NULL 則删除現有 <b>text</b> 或 <b>image</b> 列中從 insert_offset 位置開始到末尾的所有資料。
WITH LOG
在 Microsoft? SQL Server? 2000 中被忽略。在該版本中,日志記錄由資料庫的有效恢複模型決定。
inserted_data
是要插入到現有 <b>text</b>、<b>ntext </b>或 <b>image</b> 列 insert_offset 位置的資料。這是單個 <b>char</b>、<b>nchar</b>、<b>varchar</b>、<b>nvarchar</b>、<b>binary</b>、<b>varbinary</b>、<b>text</b>、<b>ntext</b> 或 <b>image</b> 值。inserted_data 可以是文字或變量。
table_name.src_column_name
用作插入資料源的表或 <b>text</b>、<b>ntext </b>或 <b>image</b> 列的名稱。表名和列名必須符合辨別符的規則。
src_text_ptr
指向作為插入資料源使用的 <b>text</b>、<b>ntext </b>或 <b>image</b> 列的文本指針值(由 TEXTPTR 函數傳回)。
WRITETEXT允許對現有的 <b>text</b>、<b>ntext</b> 或 <b>image</b> 列進行無日志記錄的互動式更新。該語句将徹底重寫受其影響的列中的任何現有資料。WRITETEXT 語句不能用在視圖中的 <b>text</b>、<b>ntext</b> 和 <b>image</b> 列上。
文法WRITETEXT { table<b>.</b>column text_ptr }
[ WITH LOG ] { data }
指向 <b>text</b>、<b>ntext</b> 或 <b>image</b> 資料的指針的值。text_ptr 的資料類型必須為 <b>binary(16)</b>。若要建立文本指針,請對<b> text</b>、<b>ntext</b> 或 <b>image</b> 列用非 NULL 資料執行 INSERT 或 UPDATE 語句。有關建立文本指針的更多資訊,請參見 或 。
在 Microsoft? SQL Server? 2000 中忽略。日志記錄由資料庫的實際恢複模型決定。
data
要存儲的實際 <b>text</b>、<b>ntext</b> 或 <b>image </b>資料。data 可以是字面值,也可以是變量。對于 <b>text</b>、<b>ntext</b> 和 <b>image</b> 資料,可以用 WRITETEXT 互動插入的文本的最大長度大約是 120 KB。
本文轉自My_King1 51CTO部落格,原文連結:http://blog.51cto.com/apprentice/1360706,如需轉載請自行聯系原作者