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














 
 
 