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






