如何實現SQL Server 2008數據中的文件流功能?
如何實現SQL Server 2008數據中的文件流功能?本文我們主要就介紹這部分內容。SQL Server 2008中***的文件流功能使得你可以配制一個數據類型為varbinary(max)的列,以便將實際數據存儲在文件系統中,而非在數據庫中。只要愿意,你仍可以作為一個常規的二進制列來查詢此列,即使數據自身存儲在外部。
文件流特性通過將二進制大字段數據存儲在本地文件系統中,從而將Windows新技術文件系統(NTFS)和SQL Server數據庫引擎集成在一起。你可以使用Transact-SQL語句來查詢、插入或更新數據,或者使用Win32文件系統界面來直接訪問數據。
微軟建議你僅在以下幾種情況下使用文件流:(1)你的二進制大字段數據文件平均大于1M,(2)你需要快速讀取此數據,(3)你的應用程序使用中間列來處理應用邏輯。否則,你應該使用常規的varbinary(max)列。
要激活SQL Server 2008服務中的文件流支持,需要遵照以下幾步:
配制數據庫來支持文件流存儲。
定義支持文件流存儲的列。
啟動SQL Server服務中的文件流支持
要激活SQL Server 2008中指定實例的文件流支持,你必須首先配制此實例的SQL Server服務。在SQL Server配制管理器中,打開服務屬性并選擇“文件流”頁簽。
你至少需要選上“啟動Transact-SQL文件流訪問”勾選框。因為插入及更新數據最有效的方法是通過Win32界面,然而,你也需要激活服務來持文件流(如果有必要,也可以啟動允許遠程客戶端訪問文件流數據)。
在你激活了SQL Server服務中的文件流支持后,必須設置文件流訪問級別,你可以在SQL Server管理器中設置。要設置訪問級別,需執行以下T-SQL語句:
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- EXEC sp_configure filestream_access_level, 2
- GO
- RECONFIGURE
- GO
在這里,我使用系統存儲過程sp_configure將訪問級別設為2,這個級別可同時支持T-SQL和Win32流訪問。如果我想只是支持T-SQL訪問,則需要將訪問級別設為1。如果設置為0,將會禁用SQL Server實例的文件流支持。在你運行存儲過程后,需要運行RECONFIGURE命令來應用新的選項設置。
配制數據庫來支持文件流存儲
支持文件流存儲的下一步操作是向數據庫定義中添加一個文件流文件組。文件流文件組是一個特殊的文件組類型,它包含文件系統目錄(數據容器)。例如,在下邊的數據庫定義中,我創建了一個名為FileStreamGrp的文件流文件組。
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- USE master
- GO
- IF EXISTS
- SELECT name FROM sys.databases
- WHERE name = 'HumanResources')
- DROP DATABASE HumanResources
- GO
- CREATE DATABASE HumanResources
- ON
- PRIMARY(
- NAME = HumanRscsDat,
- FILENAME = 'C:/Data/HR/HumanRscsDat.mdf'),
- FILEGROUP FileStreamGrp CONTAINS FILESTREAM(
- NAME = HumanRscsFs,
- FILENAME = 'C:/Data/HR/FileStream')
- LOG ON(
- NAME = HumanRscsLog,
- FILENAME = 'C:/Data/HR/HumanRscsLof.ldf')
注意,文件流文件組定義包括“文件流關鍵字”,后邊跟著邏輯名與文件名。在這里,此文件名僅僅是一個目錄路徑,沒有一個真實的名稱。當你指定了路徑,每個對象(除了最深的一個)必須存在,且最深的一個不存在。舉個例子,目錄C:/DATA/HR必須在你運
行此語句之前存在,但是C:/Data/HR/FileStream不能存在。 當你向數據庫定義中增加一個文件流文件組,SQL Server將自動創建必要的文件夾及filestream.hdr文件(這個文件是文件流容器的頭文件)和$FSLOG文件夾(支持文件流日志)。
定義支持文件流存儲的列
設置文件流存儲的下一步是配制文件流列。要使一張表包含一個文件流列,它必須也要包含一個ROWGUIDCOL關鍵字,且此關鍵字需要配制為非空和唯一約束。這個文件流列對于支持Win32文件流訪問來說是必須的。
此文件流列本身必須配制為varbinary(max)類型,并包含FILESTREAM關鍵字,如下邊的建表語句:
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- USE HumanResources
- GO
- IF OBJECT_ID ( N'Candidate', N'U') IS NOT NULL
- DROP TABLE dbo.Candidate
- GO
- CREATE TABLE Candidate(
- CandidateId INT IDENTITY PRIMARY KEY,
- CandidateGuid UNIQUEIDENTIFIER ROWGUIDCOL
- NOT NULL UNIQUE DEFAULT NEWID(),
- CandidateResume VARBINARY(MAX) FILESTREAM NULL
正如你看到的,列CandidateResume包含FILESTREAM關鍵字,它在數據類型名稱之后。
查詢文件流列
一旦你建立了SQL Server來支持文件流存儲,就可以使用T-SQL語句來查詢并修改數據。例如,以下的插入語向CandidateResume列中添加二進制數據。
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- INSERT INTO Candidate(CandidateResume)
- VALUES (CAST(
- 'Resume test data' AS VARBINARY(MAX)))
然后你可以獲取CandidateResume列返回的數據,就好像你從任何其它列獲取數據一樣。
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- SELECT CandidateResume
- FROM Candidate
- WHERE CandidateId = 1
此SELECT語句返回以下二進制數據集:0x526573756D6520746573742064617461 你也可以輕松地通過替換值來更新數據:
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- UPDATE Candidate
- SET CandidateResume =
- CAST( 'New resume test data' AS VARBINARY(MAX))
- WHERE CandidateId = 1
注意,我傳遞進去的是一個二進制值。如果你重新執行上邊的SELECT語句,你現在會獲以下結果:0x4E657720726573756D6520746573742064617461
正如你在前邊的例子中看到的,使用T-SQL語句來訪問列CandidateResume的數據是一個便捷的過程。然而,很顯然,我插入并更新的測試數據要比你在一般情況下存儲在FILESTREAM列中的數據要小很多。實際上,你通常會希望使用Win32文件流來訪問數據。
為了支持Win32文件流,SQL Server 2008提供函數和API,可使得從你的應用程序訪問。盡管關于Win32文件流不是本篇文章討論的范圍之內,但了解SQL Server2008中文件流功能輕松地支持從應用程序高效數據訪問是很重要的。
獲得更多關于文件流數據的Win32流細節信息,請參考SQL Server 2008在線圖書中的主題:通過使用Win32來管理文件流數據。你通常也可以在主題文件流存儲的設計與實現中獲得更多關于文件流存儲的細節信息。同時,你目前應該已經有了當你在SQL Server實例中建立文件流存儲并定義支持文件流存儲的列時所需要的相關細節信息。
關于實現SQL Server 2008數據中的文件流功能的相關知識就介紹到這里了,希望本次的介紹能夠對您有所收獲!
【編輯推薦】