SQL Server 2005 - 善用 OPENROWSET 函數(shù)來存取大型對象(LOB)
我們在「Visual Basic 2005 檔案 IO 與資料存取秘訣」一書的第七章,詳細(xì)探討了如何于前端程序處理大型對象(LOB)。有讀者詢問,SQL Server 2005 本身是否提供任何的 Transact-SQL 陳述式來處理 LOB 呢?答案當(dāng)然是肯定的,而且具備相關(guān)處理能力的 Transact-SQL 陳述式還不只一個(gè)。不過在本文中,我們將把焦點(diǎn)擺在 OPENROWSET 函數(shù)。
SQL Server 2005 的 OPENROWSET 函數(shù)能夠一次就完成遠(yuǎn)程數(shù)據(jù)的連結(jié)與存取作業(yè)。OPENROWSET 函數(shù)在使用的形式上就好比是一個(gè)資料表,比方說,您可以在 SELECT 陳述式的 FROM 子句中參考 OPENROWSET 函數(shù),此外,視 OLE DB 提供者的能力而定,您也可以在 INSERT、UPDATE 或 DELETE 陳述式中把 OPENROWSET 函數(shù)當(dāng)成目標(biāo)數(shù)據(jù)表來使用。
特別值得一提的是,SQL Server 2005 替 OPENROWSET 函數(shù)加入了 BULK 數(shù)據(jù)列集提供者,使得您可以直接從文字文件、XML 文件、以及圖檔…等檔案中讀取數(shù)據(jù)。此意味著,從現(xiàn)在開始,您可以在一道非常簡單的 INSERT INTO…SELECT 陳述式中使用 OPENROWSET 函數(shù)來將內(nèi)含大量數(shù)據(jù)的檔案內(nèi)容存入數(shù)據(jù)表的字段中。
OPENROWSET BULK 選項(xiàng)自變量可以精確控制數(shù)據(jù)讀取的開始與結(jié)束位置、如何處理錯(cuò)誤、以及資料要如何被解譯。比方說,您可以要求將數(shù)據(jù)文件讀取成 varbinary、varchar 或 nvarchar 型別的單一數(shù)據(jù)列與單一字段的數(shù)據(jù)列集。
我想光說不練是沒有用的在,以下的程序代碼中,我們會先建立一個(gè)數(shù)據(jù)表,然后使用 INSERT INTO…SELECT 陳述式來新數(shù)據(jù)記錄。請?zhí)貏e注意我們?nèi)绾问褂?OPENROWSET 函數(shù)將文字文件(.txt)與圖檔(.jpg)的內(nèi)容直接存入數(shù)據(jù)表的「自傳」與「玉照」字段中:
USE 北風(fēng)貿(mào)易;GO
IF; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.練習(xí)資料表') AND type in (N'U'))DROP TABLE dbo.練習(xí)資料表GO
--建立數(shù)據(jù)表CREATE TABLE dbo.練習(xí)資料表(編號 int IDENTITY(1,1) NOT NULL,姓名 nvarchar(10) NULL,性別 nvarchar(2) NULL,自傳 nvarchar(max) NULL,玉照 varbinary(max) NULL,);GO
--新增第一筆數(shù)據(jù)(包括 NCLOB 與 BLOB 在內(nèi))INSERT INTO dbo.練習(xí)資料表(姓名, 性別,自傳,玉照)SELECT '章立民' AS 姓名, '男' AS 性別,* FROMOPENROWSET (BULK 'C:TempEmployee-A156401174.txt', SINGLE_NCLOB) AS 自傳, OPENROWSET (BULK 'C:TempEmployee-A156401174.jpg', SINGLE_BLOB) AS 玉照;GO
--新增第二筆數(shù)據(jù)(包括 NCLOB 與 BLOB 在內(nèi))INSERT INTO dbo.練習(xí)資料表(姓名, 性別,自傳,玉照)SELECT '章立民' AS 姓名, '男' AS 性別,* FROMOPENROWSET (BULK 'C:TempEmployee-A156401174.txt', SINGLE_NCLOB) AS 自傳, OPENROWSET (BULK 'C:TempEmployee-A156404535.jpg', SINGLE_BLOB) AS 玉照;GO
章立民研究室敬上
http://www.cnblogs.com/liminzhang/archive/2006/10/18/532140.html
