将文件加载到 FileTable 中

介绍如何将文件加载或迁移到 FileTable。

将文件加载或迁移到 FileTable

选择要将文件加载或迁移到 FileTable 的方法取决于文件当前存储的位置。

文件的当前位置 迁移选项
文件当前存储在文件系统中。

SQL Server 不了解文件。
由于 FileTable 在 Windows 文件系统中显示为文件夹,因此可以使用任何可用于移动或复制文件的方法轻松地将文件加载到新的 FileTable 中。 这些方法包括 Windows 资源管理器、命令行选项(包括 xcopy 和 robocopy)以及自定义脚本或应用程序。

不能将现有文件夹转换为 FileTable。
文件当前存储在文件系统中。

SQL Server 包含包含指向文件的指针的元数据表。
第一步是使用上述方法之一移动或复制文件。

第二步是更新现有元数据表,以指向文件的新位置。

有关详细信息,请参阅 示例:将文件从文件系统迁移到本主题中的 FileTable

如何:将文件加载到 FileTable 中

可用于将文件加载到 FileTable 的方法包括:

  • 将文件从源文件夹拖放到 Windows 资源管理器中的新 FileTable 文件夹。

  • 在命令提示符或批处理文件或脚本中使用 MOVE、COPY、XCOPY 或 ROBOCOPY 等命令行选项。

  • 使用 C# 或 Visual Basic.NET 编写自定义应用程序,该应用程序使用 System.IO 命名空间中的方法移动或复制文件。

示例:将文件从文件系统迁移到 FileTable

在此方案中,文件存储在文件系统中,SQL Server 中有一个元数据表,其中包含指向文件的指针。 你想要将文件移动到 FileTable 中,然后将元数据中每个文件的原始 UNC 路径替换为 FileTable UNC 路径。 GetPathLocator (Transact-SQL) 函数可帮助你实现此目标。

对于此示例,假设有一个现有数据库表, PhotoMetadata其中包含有关照片的数据。 此表具有类型varchar为 (512) 的列UNCPath,其中包含 .jpg 文件的实际 UNC 路径。

若要将映像文件从文件系统迁移到 FileTable,必须执行以下作:

  1. 创建新的 FileTable 以保存文件。 此示例使用表名, dbo.PhotoTable但不显示用于创建表的代码。

  2. 使用 xcopy 或类似工具将 .jpg 文件及其目录结构复制到 FileTable 的根目录中。

  3. 使用类似于以下内容的代码修复表中的元数据 PhotoMetadata

--  Add a path locator column to the PhotoMetadata table.  
ALTER TABLE PhotoMetadata ADD pathlocator hierarchyid;  
  
-- Get the root path of the Photo directory on the File Server.  
DECLARE @UNCPathRoot varchar(100) = '\\RemoteShare\Photographs';  
  
-- Get the root path of the FileTable.  
DECLARE @FileTableRoot varchar(1000);  
SELECT @FileTableRoot = FileTableRootPath('dbo.PhotoTable');  
  
-- Update the PhotoMetadata table.  
  
-- Replace the File Server UNC path with the FileTable path.  
UPDATE PhotoMetadata  
    SET UNCPath = REPLACE(UNCPath, @UNCPathRoot, @FileTableRoot);  
  
-- Update the pathlocator column to contain the pathlocator IDs from the FileTable.  
UPDATE PhotoMetadata  
    SET pathlocator = GetPathLocator(UNCPath);  

将文件批量加载到 FileTable 中

FileTable 的行为类似于常规表进行批量作,具有以下限定条件。

FileTable 具有系统定义的约束,可确保维护文件和目录命名空间的完整性。 必须验证加载到 FileTable 中的数据上的这些约束。 由于某些批量插入作允许忽略表约束,因此将强制实施以下要求。

  • 可以对 FileTable 运行强制约束的大容量加载操作,像对任何其他表一样。 此类别包括以下操作:

    • 具有 CHECK_CONSTRAINTS 子句的 bcp。

    • 带有 CHECK_CONSTRAINTS 子句的 BULK INSERT。

    • INSERT INTO ...SELECT * FROM OPENROWSET(BULK ...) 没有 IGNORE_CONSTRAINTS 子句。

  • 除非禁用了 FileTable 系统定义的约束,否则不会强制实施约束的大容量加载作会失败。 此类别包括以下作:

    • 不带 CHECK_CONSTRAINTS 子句的 bcp。

    • 不带CHECK_CONSTRAINTS子句的 BULK INSERT。

    • INSERT INTO ... SELECT * FROM OPENROWSET(BULK ...)使用 IGNORE_CONSTRAINTS 子句。

如何:将文件大容量加载到 FileTable 中

可以使用各种方法将文件批量加载到 FileTable 中:

  • bcp

    • 使用 CHECK_CONSTRAINTS 子句进行调用。

    • 禁用 FileTable 命名空间,并在不使用 CHECK_CONSTRAINTS 子句的情况下调用。 然后重新启用 FileTable 命名空间。

  • BULK INSERT

    • 使用 CHECK_CONSTRAINTS 子句进行调用。

    • 禁用 FileTable 命名空间,并在不使用 CHECK_CONSTRAINTS 子句的情况下调用。 然后重新启用 FileTable 命名空间。

  • INSERT INTO ...SELECT * FROM OPENROWSET(BULK ...)

    • 使用 IGNORE_CONSTRAINTS 子句进行调用。

    • 禁用 FileTable 命名空间,并在不使用 IGNORE_CONSTRAINTS 子句的情况下调用。 然后重新启用 FileTable 命名空间。

有关禁用 FileTable 约束的信息,请参阅“管理 FileTable”。

如何禁用批量加载的 FileTable 约束

若要将文件批量加载到 FileTable 中,而无需强制实施系统定义的约束,可以暂时禁用约束。 有关详细信息,请参阅“管理 FileTable”。

另请参阅

使用 Transact-SQL 访问 FileTable
使用文件 Input-Output API 访问 FileTable