1. 文件存储介绍
Microsoft SQL Server (MSSQL) , 一个流行的关系型数据库管理系统(RDBMS),其中包括一些有趣的功能。其中之一是文件存储。文件存储使数据库管理员能够存储二进制文件和文档,并将它们与表中的其他列一样存储在数据库中。这使得文件在关系数据库管理系统中的管理变得更加容易。
文件存储最突出的好处之一是可以避免文件散布在多个位置上的问题,从而减少不必要的混乱。将文件存储在数据库内部可以方便地与关联的信息一同存储,而无需关心文件的位置。
2. 创建一张文件表
2.1 创建一个文件表
要将文件存储在数据库中,我们必须首先创建一个表来存储这些文件。以下是创建文件表的示例SQL:
CREATE TABLE FileTable (
FileTableID UNIQUEIDENTIFIER NOT NULL UNIQUE ROWGUIDCOL,
Name NVARCHAR(255) NULL,
FileData VARBINARY(MAX) FILESTREAM NULL
)
这将创建一个表。其中包含一个自动编号列、文件名列和一个带有FILESTREAM属性的二进制数据列,此属性表示该列是用于存储文件的。而且,使用这个属性可以避免将二进制数据存储在数据库中,因为FILESTREAM将数据存储在操作系统文件系统中。可使用Visual Studio进行开发,也可以使用SQL Server Management Studio进行操作。
2.2 开启FileTable和文件流
在存储文件时,我们需要先在SQL Server Management Studio中启用对文件表和文件流的支持。我们可以通过以下方式开始:
EXEC sp_configure 'filestream_access_level', 2
RECONFIGURE
首先运行上面的代码,此代码将文件读/写支持级别设置为2。然后重新配置数据库以使此更改生效。现在我们已经在数据库中启用了对文件表和文件流的支持。
3. 向文件表中添加数据
现在我们可以使用INSERT语句将文件存储在文件表中。以下是一个INSERT语句的示例:
DECLARE @FileTableID UNIQUEIDENTIFIER
SET @FileTableID = NEWID()
INSERT INTO FileTable (FileTableID, Name, FileData)
VALUES (@FileTableID, 'Document.docx', (SELECT * FROM OPENROWSET(BULK N'C:\Temp\Document.docx', SINGLE_BLOB) AS FileData))
这将向数据库中的文件表插入一条记录,并将文件Document.docx从本地计算机上传到FileData列。这里使用了行内SELECT语句,这是因为名为FileData的列标识了存储文件的存储文件组件,并且该部分使用OPENROWSET函数从磁盘加载文件到表中。
4. 从文件表中检索数据
4.1 检索包含文件数据的所有行
要从文件表中检索包含文件数据的所有行,我们可以使用以下查询:
SELECT * FROM FileTable
它将返回包含所有文件数据的行。
4.2 检索单个文件
通常,我们从文件表中检索一次只需要一个文件。我们可以使用以下查询:
SELECT Name, FileData.PathName() AS FilePath, GET_FILESTREAM_TRANSACTION_CONTEXT() AS TransactionContext
FROM FileTable
WHERE FileTableID = 'GUID_HERE'
文件ID必须替换为您要检索的文件的实际ID。此查询将返回单个文件及其所在的物理文件路径和事务上下文。使用这个路径,我们可以在文件系统中查找文件。
5. 删除文件
要删除文件,请使用以下命令:
DECLARE @TransactionContext VARBINARY(512);
SET @TransactionContext = GET_FILESTREAM_TRANSACTION_CONTEXT();
BEGIN TRAN
DELETE FROM FileTable WHERE FileTableID = 'FileTableID'
COMMIT TRAN
必须设置一个事务上下文,才能成功完成这个操作。这个上下文在查询文件时获得,并在删除操作期间被指定。
结论
文件存储是在MSSQL中管理文件的一种有效方法。如果您经常需要管理或存储文件,那么在数据库中存储它们可能很方便,因为文件将自动与相关数据链接在一起。在建立存储文件的表后,在MSSQL中存储和检索文件是一件很容易的事情,也很容易删除文件。这种方法不仅可用于大文件,而且对于存储小图片或文档也非常有效。