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