1. 程式人生 > 其它 >[SQLServer大物件]——FileTable從檔案系統遷移檔案

[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名稱空間