使用 FileTable 中的目录和路径

适用范围:SQL Server

说明 FileTable 中用于存储文件的目录结构。

如何在 FileTable 中使用目录和路径

可以使用以下三个函数来处理 Transact-SQL 中的 FileTable 目录:

为得到这一结果 使用此函数
获取特定 FileTable 或当前数据库的根级 UNC 路径。 FileTableRootPath (Transact-SQL)
获取 FileTable 中文件或目录的绝对或相对 UNC 路径。 GetFileNamespacePath (Transact-SQL)
通过提供路径,获取 FileTable 中指定文件或目录的路径定位器 ID 值。 GetPathLocator (Transact-SQL)

使用相对路径编写可移植代码

若要使代码和应用程序独立于当前的计算机和数据库,应避免编写依赖于绝对文件路径的代码。 可通过使用 FileTableRootPath (Transact-SQL)GetFileNamespacePath (Transact-SQL) 函数组合在运行时获取文件的完整路径,如下例所示。 默认情况下,GetFileNamespacePath 函数返回数据库根路径下的文件的相对路径。

USE database_name;

DECLARE @root NVARCHAR(100);
DECLARE @fullpath NVARCHAR(1000);

SELECT @root = FileTableRootPath();

SELECT @fullpath = @root + file_stream.GetFileNamespacePath()
FROM filetable_name
WHERE name = N'document_name';

PRINT @fullpath;
GO

限制

嵌套级别

重要

您不能在 FileTable 目录中存储超过 15 个级别的子目录。 在您存储 15 个级别的子目录时,最下面的一级不能包含文件,因为这些文件将代表另外一个级别。

完整路径名的长度

重要

NTFS 文件系统支持远远超过 Windows 外壳程序和大多数 Windows API 的 260 个字符限制的路径名。 因此,使用 Transact-SQL 在 FileTable 的文件层次结构中创建的文件有可能无法使用 Windows 资源管理器或很多其他 Windows 应用程序查看或打开,原因是这些文件的完整路径名称超过了 260 个字符。 但是,您可使用 Transact-SQL 继续访问这些文件。

FileTable 中存储的项的完整路径

FileTable 中存储的文件或目录的完整路径用以下元素开头:

  1. 为在 SQL Server 实例级别进行 FILESTREAM 文件 I/O 访问启用的共享区。

  2. 在数据库级别指定的 DIRECTORY_NAME

  3. 在 FileTable 级别指定的 FILETABLE_DIRECTORY

生成的层次结构如下所示:

\\<machine>\<instance-level FILESTREAM share>\<database-level directory>\<FileTable directory>\

此目录层次结构构成了 FileTable 的文件命名空间的根。 在此目录层次结构下,FileTable 的 FILESTREAM 数据存储为文件和还可以包含文件和子目录的子目录。

请务必记住,在此实例级别 FILESTREAM 共享区下创建的目录层次结构是虚拟目录层次结构。 该层次结构存储于 SQL Server 数据库中,并且在 NTFS 文件系统中没有物理表示。 访问 FILESTREAM 共享区之下及其包含的 FileTable 中的文件和目录的所有操作,都将被文件系统中嵌入的 SQL Server 组件拦截和处理。

实例级、数据库级和 FileTable 级根目录的语义

此目录层次结构遵循下面的语义:

  • 实例级别 FILESTREAM 共享区由管理员配置并且存储为服务器的属性。 可以通过使用 SQL Server 配置管理器重命名该共享区。 在重启服务器之前,重命名操作不会生效。

  • 在创建新的数据库时,数据库级 DIRECTORY_NAME 默认为 Null。 管理员可以通过使用 ALTER DATABASE 语句设置或更改此名称。 此名称在该实例中必须唯一(不区分大小写比较时)。

  • 在创建 FileTable 时,通常提供 FILETABLE_DIRECTORY 名称作为 CREATE TABLE 语句的一部分。 可以通过使用 ALTER TABLE 命令来更改此名称。

  • 不能通过文件 I/O 操作来重命名这些根目录。

  • 不能使用独占式文件句柄打开这些根目录。

FileTable 架构中的 is_directory 列

下表描述了 is_directory 列与 FileTable 中 包含 FILESTREAM 数据的 file_stream 列之间的交互。

is_directory 值 file_stream 值 行为
FALSE NULL 这是一个无效组合,被系统定义的约束捕获。
FALSE <value> 该项表示一个文件。
TRUE NULL 该项表示一个目录。
TRUE <value> 这是一个无效组合,被系统定义的约束捕获。

将虚拟网络名称 (VNN) 与 Always On 可用性组一起使用

当包含 FILESTREAM 或 FileTable 数据的数据库属于某一可用性组时: