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


    阅读导航

    从文件系统中迁移文件到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 的元数据:

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

  • 相关阅读:
    Linux下通过Generic Binaries安装MySQL 5.5
    struts 2 中AJAX的使用及Struts 2 JSON的使用
    关于Abstract interface的问题。
    对于“Win8对开发者的影响”的一些看法
    RealtimeModifier Bug Report | RealtimeModifier Bug 反馈
    何为Tomcat内存
    SSH开发过程中的中文问题汇总
    Spring Test 整合 JUnit 4 使用总结
    创建Shell脚本方便MySQL服务端启动
    学习笔记 winForm move功能 与 drag 功能
  • 原文地址:https://www.cnblogs.com/BoyceYang/p/3175610.html
Copyright © 2020-2023  润新知