将文件加载到 FileTable 中
适用范围:SQL Server
说明如何将文件加载或迁移到 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
在这种情况下,文件将存储在文件系统中,并且将有一个元数据表,其中包含指向这些文件的指针。 您要将文件移入 FileTable,然后用 FileTable UNC 路径替换元数据中每个文件的原始 UNC 路径。 GetPathLocator 函数可助你实现这一目标。
对于此示例,假定有一个现有的数据库表 PhotoMetadata
,其中包含有关照片的数据。 该表具有 varchar(512) 类型的 UNCPath
列,其中包含指向 .jpg
文件的实际 UNC 路径。
要将图像文件从文件系统迁移到 FileTable,必须执行以下操作:
创建新的 FileTable 来保存文件。 此示例将使用表名
dbo.PhotoTable
,但不显示用来创建该表的代码。使用 xcopy 或类似的工具将
.jpg
文件连同目录结构一起复制到 FileTable 的根目录下。通过使用类似于以下示例的代码修复
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
。 - 不带
IGNORE_CONSTRAINTS
子句的INSERT INTO ... SELECT * FROM OPENROWSET(BULK ...)
。
- 具有
不强制执行约束的大容量加载操作将失败,除非 FileTable 系统定义的约束已禁用。 此类别包括下列操作:
- 不带
CHECK_CONSTRAINTS
子句的 bcp。 - 不带
CHECK_CONSTRAINTS
子句的BULK INSERT
。 - 具有
IGNORE_CONSTRAINTS
子句的INSERT INTO ... SELECT * FROM OPENROWSET(BULK ...)
。
- 不带
如何:将文件大容量加载到 FileTable 中
您可以使用各种方法来大容量加载文件到 FileTable:
使用 CHECK_CONSTRAINTS
子句调用。
禁用 FileTable 命名空间并不使用 CHECK_CONSTRAINTS
子句调用。 然后重新启用 FileTable 命名空间。
有关禁用 FileTable 约束的信息,请参阅 管理 FileTables。
如何:禁用针对大容量加载的 FileTable 约束
若要在没有强制系统定义约束的开销的情况下将文件大容量加载到 FileTable 中,可以暂时禁用约束。 有关详细信息,请参阅 管理 FileTables。