一 、FileStream和FileTable介绍
我们经常需要把结构化数据(int、Char等)和非结构化数据(如Varbinary(max))一起存储,那我们在怎么存储的呢?
1、 在SQL Server 2008之前,我们通常在数据库中存储结构化的数据,并且将非结构化数据(例如文档、音频、视频等)存储在NTFS文件系统中,然后在数据库中存放这些文件的路径。但是显而意见,很难保证文件系统和数据库的一致性。
2、 在SQL Server 2008,新增了FileStream,它允许我们将Varbinary(max)类型的文件存放在NTFS文件系统,但是能够直接通过SQL Server管理文件系统中的文件,有效地保证了事务的一致性。但是文件系统只是用来存储文件而已,并不能用来组织和管理文件。
3、 在SQL Server2012,在FileStream的基础之上新增了FileTable,它拥有FileStream的一切功能。并且通过Windows的文件系统能够组织和管理文件,对于文件的一切操作都会反映在SQL Server的文件表中,例如在文件系统中新建文件、新建文件夹、更改文件类型、文件大小等 ,都会相应地在SQL Server的文件表上做相应的操作。
二 、如何配置和使用FileTable
1、 在SQL Server配置管理器中开启文件流访问
a) 勾上“针对Transact-SQL访问启用FileStream”
b) 勾上“启用FileStream进行文件I/O访问”。“Windows共享名(W)”处填入“CanwaySQLFile”
c) 勾上“允许远程客户端访问FileStream数据(R)”

2、 在数据库的实例属性上允许访问文件流
打开“SQL Server Management Studio”,修改该实例的配置。默认配置如下:

将“FileStream访问级别”从“已禁用”改成“已启用完全访问”

其中“FileStream访问级别”有三种可选项:
a) 已禁用
无法将二进制大型对象 (BLOB) 数据存储在文件系统中。此为默认值。即filestream access level=0
b) 已启用 Transact-SQL 访问
可使用 Transact-SQL 访问 FILESTREAM 数据,但不能通过文件系统进行访问。即filestream access level=1
c) 已启用完全访问
FILESTREAM 数据可使用 Transact-SQL 以及通过文件系统进行访问。即filestream access level=0
点击“确定”之后提示必须重启SQL Server服务才会生效:

3、 数据库中添加文件流组和文件
a) 添加文件流组
右键数据库FileTableDB->属性->文件组,在下方的“FileStream”点击“添加”来添加一个文件流组FileStreamGroup。


b) 添加文件
添加了文件流组之后就可以在文件流组中添加数据文件
右键数据库FileTableDB->属性->文件,添加一个名为“FileTable”、文件类型为“FileStream数据”、文件组为“FileStreamGroup”、路径为“E:\FB”的数据库文件。

打开目录“E:\FB”,可以看到自动新建了一个文件夹“FileTable”,在FileTable文件夹下面有一个filestream.hdr文件,它是是FILESTREAM 容器的头文件
4、 数据库启用“非事务访问”和填写“FileStream目录名称”
右键数据库FileTableDB->属性->选项
a) 在“FileStream非事务访问”处选项“Full”

b) 在“FileStream目录名称”处填写“ImageFile”

点击“确定”后提示:

直接点击是就可以了。
5、 创建文件表FileTable
打开SSMS,打开新的查询窗口,输入以下命令并运行

展开数据库FileTableDB,在数据库下有一个名为FileTable的文件夹,展开此文件夹,可以看到一个名为ImageTable2并且拥有很多列的表。

6、 获取共享路径
在数据库FileTableDB下创建文件表ImageTable2之后,就能够通过Windows的资源管理器来看到文件表ImageTable2中存放的文件。
先获取文件表ImageTable2的共享路径,在SSMS下运行以下命令可以得到:

7、 通过共享路径访问数据库FileTableDB下文件表ImageTable2中存放的文件
a) 通过共享路径访问

目前共享文件中没有文件。
b) 查询ImageTable2

目录表ImageTable2也是空的
c) 在Windows资源管理器上打开上面的共享目录
i. 新建一个名为“Test.txt”的文件

然后再查询表ImageTable2

(后面还有其它字段,截图没截到)
可以发现,在共享目录下创建一个文件,那么在表ImageTable2下也会自动添加一条记录。
ii. 同样地,在数据库中删除表ImageTable2下的记录也会相应地自动删除共享目录下的文件。


iii. 在共享目录下创建文件夹也会自动地在文件表中创建一个文件夹


iv. 共享目录下修改文件的名字、增加文件的内容、更改文件的类型等都会自动地在数据库的ImageTable2下做相应的更改。
三 、总结
通过SQL Server 2012的FileTable,我们可以很方便地组织和管理存放在数据库中的文件。可以通过文件系统直接为文件建立多级目录进行分类管理,可以修改文件类型,修改文件名等,这些都不会影响到数据库和文件系统的一致性。