SQL Server 2005 - 善用 OPENROWSET 函數來存取大型物件(LOB)

摘要:SQL Server 2005 - 善用 OPENROWSET 函數來存取大型物件(LOB)

我們在「Visual Basic 2005 檔案 IO 與資料存取秘訣」一書的第七章,詳細探討了如何於前 端程式處理大型物件(LOB)。有讀者詢問,SQL Server 2005 本身是否提供任何的 Transact-SQL 陳述式來處理 LOB 呢?答案當然是肯定的,而且具備相關處理能力的 Transact-SQL 陳述式還不只一個。不過在本文中,我們將把焦點擺在 OPENROWSET 函數。

SQL Server 2005 的 OPENROWSET 函數能夠一次就完成遠端資料的連結與存取作業。OPENROWSET 函數在使用的形式上就好比是一個資料表,比方說,您可以在 SELECT 陳述式的 FROM 子句中參考 OPENROWSET 函數,此外,視 OLE DB 提供者的能力而定,您也可以在 INSERTUPDATE DELETE 陳述式中把 OPENROWSET 函數當成目標資料表來使用。

特別值得一提的是,SQL Server 2005 替 OPENROWSET 函數加入了 BULK 資料列集提供者,使得您可以直接從文字檔、XML 檔、以及圖檔…等檔案中讀取資料。此意味著,從現在開始,您可以在一道非常簡單的 INSERT INTO…SELECT 陳述式中使用 OPENROWSET 函數來將內含大量資料的檔案內容存入資料表的欄位中。

OPENROWSET BULK 選項引數可以精確控制資料讀取的開始與結束位置、如何處理錯誤、以及資料要如何被解譯。比方說,您可以要求將資料檔讀取成 varbinaryvarchar nvarchar 型別的單一資料列與單一欄位的資料列集。

我想光說不練是沒有用的在,以下的程式碼中,我們會先建立一個資料表,然後使用 INSERT INTO…SELECT 陳述式來新資料記錄。請特別注意我們如何使用 OPENROWSET 函數將文字檔(.txt)與圖檔(.jpg)的內容直接存入資料表的「自傳」「玉照」欄位中:

USE 北風貿易;
GO

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id =
           OBJECT_ID(N'dbo.練習資料表') AND type in (N'U'))
DROP TABLE dbo.練習資料表
GO

--建立資料表
CREATE TABLE dbo.練習資料表(
 編號 int IDENTITY(1,1) NOT NULL,
 姓名 nvarchar(10) NULL,
 性別 nvarchar(2) NULL,
 自傳 nvarchar(max) NULL,
 玉照 varbinary(max) NULL,
 );
GO

--新增第一筆資料(包括 NCLOB 與 BLOB 在內)
INSERT INTO dbo.練習資料表
(
姓名,
性別,
自傳,
玉照
)
SELECT '章立民' AS 姓名, '男' AS 性別,
 * FROM
 OPENROWSET
    (BULK 'C:\Temp\Employee-A156401174.txt', SINGLE_NCLOB) AS 自傳
,
 OPENROWSET
    (BULK 'C:\Temp\Employee-A156401174.jpg', SINGLE_BLOB) AS 玉照
;
GO

--新增第二筆資料(包括 NCLOB 與 BLOB 在內)
INSERT INTO dbo.練習資料表
(
姓名,
性別,
自傳,
玉照
)
SELECT '章立民' AS 姓名, '男' AS 性別,
 * FROM
 OPENROWSET
    (BULK 'C:\Temp\Employee-A156401174.txt', SINGLE_NCLOB) AS 自傳
,
 OPENROWSET
    (BULK 'C:\Temp\Employee-A156404535.jpg', SINGLE_BLOB) AS 玉照
;
GO