sql server 2008 filestream

sql server 2008 filestream

文件流的出现就是为了解决对大对象的存储中一个矛盾。

对于大对象,在没有文件流以前,一般有二种方法:

第一种方式是存储在数据库里面,这种方式一般使用image字段,或者varbinary(max)来做。好处是可以统一备份,但实际上读取效率比较低。大于1MB的文件就会有问题

第二种方式是文件存储在文件系统,而数据库中存储了一个路径。这种方式数据库压力减轻了,却很不方便统一备份和管理

SQL SERVER 2008的文件流其实就是二者的统一。文件还是放在文件系统的,但由数据库进行管理。可以统一备份和还原。

FILESTREAM不是一个字段类型,它定义在字段后面,声明该列用于文件流即可。该列依然是用二进制保存的

一般都是在数据库中要特别添加一个文件组和一个或多个文件用来存储FileStream的数据的。

--这段代码的作用是启用服务器支持文件流

EXEC sp_filestream_configure

@enable_level = 3;

CREATE DATABASE Archive

ON

PRIMARY ( NAME = Arch1,

FILENAME = 'd:	estarchdat1.mdf'),

FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = Arch3,

FILENAME = 'd:	estfilestream1')

LOG ON ( NAME = Archlog1,

FILENAME = 'd:	estarchlog1.ldf')

GO

CREATE TABLE [DemoFileStreamTable_1] (
[FileId] UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,--如果一个表要使用文件流,则必须有一个GUID列,而且作为唯一键列
[FileName] VARCHAR (25),
[File] VARBINARY (MAX) FILESTREAM);--这一句指示该列要用文件流存储

FILESTREAM_ON FileStreamGroup1 --该行指示存储到哪一个文件流文件组

GO

  我们将数据插入到新创建的FILESTREAM表中。 在此示例中,我们将插入位于“ C: sqlshack”文件夹中的图片。

DECLARE @File varbinary(MAX);  
SELECT  
@File = CAST(  
bulkcolumn as varbinary(max)  
)  
FROM  
OPENROWSET(BULK 'C:sqlshackakshita.png', SINGLE_BLOB) as MyData; 
 
INSERT INTO DemoFileStreamTable_1  
VALUES  
(  
NEWID(),  
'Sample Picture',  
@File
)

  我们可以从演示表中选择记录。 在“文件”列中,您可以看到图像已转换为varbinary对象。

SELECT TOP (1000) [FileId]
,[FileName]
,[File]
FROM [FileStreamDemoDB].[dbo].[DemoFileStreamTable_1]

  

当我们使用FILESTREAM功能插入文档时,SQL Server将文件复制到FILESTREAM路径中。 它不会更改文件属性。 我们可以使用兼容的应用程序直接打开此文件。

更新FILESTREAM文档,但是,FILESTREAM路径也包含旧的图像文件。 SQL Server并未删除此文件。

QL Server有一个特定的内部filestream_tombstone表,其中包含此旧文件的条目。仅当filestream_tombstone表中没有该文件的条目时,垃圾收集过程才会删除该旧文件。

我们可以手动运行垃圾收集器进程文件,以在自动垃圾收集器进程清除文件之前从容器中删除文件。 

sp_filestream_force_garbage_collection   @dbname, @filename

UPDATE DemoFileStreamTable_1
SET [File] = (SELECT *
FROM OPENROWSET(
BULK 'C:sqlshackSQL Server Profiler in Azure Data Studio.docx',
SINGLE_BLOB) AS Document)
WHERE fileid = '60236384-AC5B-45D1-97F8-4C05D90784F8'
GO
 
Update DemoFileStreamTable_1
set filename='Sample Doc'
WHERE fileid = '60236384-AC5B-45D1-97F8-4C05D90784F8'
GO

  

原文地址:https://www.cnblogs.com/hnxxcxg/p/13975889.html