在 FileTable 中使用目录和路径

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

主题内容

我想要…

  • 在 FileTable 中使用目录和路径

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

了解详细信息

  • 重要限制

    • 嵌套级别

    • 完整路径名的长度

  • FileTable 中存储的项的完整路径

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

  • FileTable 架构中的 is_directory 列

  • 将虚拟网络名称 (VNN) 用于 AlwaysOn 可用性组

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

您可以使用以下 3 个函数以便在 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

<值>

该项表示一个文件。

TRUE

NULL

该项表示一个目录。

TRUE

<值>

这是将被系统定义的约束捕获的无效组合。

[返回页首]

将虚拟网络名称 (VNN) 用于 AlwaysOn 可用性组

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

[返回页首]

请参阅

概念

启用 FileTable 的先决条件

创建、更改和删除 FileTable

使用 Transact-SQL 访问 FileTable

使用文件 I\O API 访问 FileTable