Maison  >  Article  >  base de données  >  [SQLServer大对象]FileTable从文件系统迁移文件

[SQLServer大对象]FileTable从文件系统迁移文件

WBOY
WBOYoriginal
2016-06-07 15:19:221210parcourir

阅读导航 从文件系统中迁移文件到FileTable 批量加载文件到FileTable 如何批量加载文件到FileTable 通过博文 [SQLServer大对象]FileTable初体验 ,已经可以将文件加载到数据库中,并查看和访问这些文件。 将文件加载到 FileTable,可以使用工具xcopy或roboco

阅读导航

从文件系统中迁移文件到FileTable

批量加载文件到FileTable

如何批量加载文件到FileTable

 

通过博文[SQLServer大对象]——FileTable初体验,已经可以将文件加载到数据库中,并查看和访问这些文件。

将文件加载到 FileTable,可以使用工具xcopy或robocopy,也可以自己编写脚本(如PowerShell)或者应用程序,复制文件到FileTable中。

现在说一说文件的迁移。

 

从文件系统中迁移文件到FileTable

迁移文件条件

    文件存储在文件系统中

    在 SQL Server 中元数据的表包含一个指向文件的指针

执行前提

要将文件迁入到 FileTable,需要将每一个文件的原始UNC路径用FileTable的UNC路径代替。

现在我们假定现有 FileTable PhotoMetadata 包含图片数据,。这个表有一个varchar(512)类型的UNC路径列,其中包含执行.jpg文件的实际路径。

将.jpg及其目录结构一起复制到FileT的根目录下。

执行

使用代码修改 PhotoMetadata 的元数据:

<span>   1:  </span><span>--  添加一个路径定位器到 PhotoMetadata。</span>
<span>   2:  </span><span>ALTER</span> <span>TABLE</span> PhotoMetadata <span>ADD</span> pathlocator hierarchyid;
<span>   3:  </span> 
<span>   4:  </span><span>-- 获得在文件系统中图片的根路径。</span>
<span>   5:  </span><span>DECLARE</span> @UNCPathRoot <span>varchar</span>(100) = <span>'\\RemoteShare\Photographs'</span>;
<span>   6:  </span> 
<span>   7:  </span><span>-- 获得FileTable的根路径。</span>
<span>   8:  </span><span>DECLARE</span> @FileTableRoot <span>varchar</span>(1000);
<span>   9:  </span><span>SELECT</span> @FileTableRoot = FileTableRootPath(<span>'dbo.PhotoTable'</span>);
<span>  10:  </span> 
<span>  11:  </span><span>-- 更新PhotoMetadata。</span>
<span>  12:  </span> 
<span>  13:  </span><span>-- 使用 FileTable 路径代替文件系统 UNC 路径。</span>
<span>  14:  </span><span>UPDATE</span> PhotoMetadata
<span>  15:  </span>    <span>SET</span> UNCPath = REPLACE(UNCPath, @UNCPathRoot, @FileTableRoot);
<span>  16:  </span> 
<span>  17:  </span><span>-- 更新 FileTable 的 pathlocator 列。 </span>
<span>  18:  </span><span>UPDATE</span> PhotoMetadata
<span>  19:  </span>    <span>SET</span> pathlocator = GetPathLocator(UNCPath);

批量加载文件到FileTable

对于批量操作,FileTable和其他表基本一样,但是有些需要注意的地方。

FileTable有系统定义的约束,这些约束是为了确保文件的完整性和目录空间具有可维护性。这些约束验证数据批量加载到FileTable中。由于一些大量插入操作允许忽略表约束,所以接下来的是被强制要求的。

    强制约束的批量加载操作可以像在任何其他表一样在 FileTable使用,具体操作如下:

        bcp 带 CHECK_CONSTRAINTS 子句。

        BULK INSERT 带 CHECK_CONSTRAINTS 子句。

        INSERT INTO … SELECT * FROM OPENROWSET(BULK …) 不带 IGNORE_CONSTRAINTS 子句。

    非强制约束的批量加载操作会失败,除非 FileTable 系统定义的约束已禁用,具体操作如下:

        bcp 不带 CHECK_CONSTRAINTS 子句。

        BULK INSERT 不带 CHECK_CONSTRAINTS 子句。

        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 …)

        使用 CHECK_CONSTRAINTS 子句。

        禁用FileTable命名空间,并且不使用 CHECK_CONSTRAINTS 子句。然后重新启用FileTable命名空间

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn