描述如何載入或移轉檔案至 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
在此情況下,您的檔案會儲存在檔案系統中,而且您擁有在 SQL Server 中內有指向這些檔案之指標的中繼資料資料表。 您想要將檔案移入 FileTable,然後使用 FileTable UNC 路徑來取代中繼資料內每個檔案的原始 UNC 路徑。 GetPathLocator (Transact-SQL) 函式可協助您達成此目標。
在此範例中,假設有現有的資料庫數據表 , PhotoMetadata其中包含相片的相關數據。 此數據表有資料行UNCPath類型為varchar(512),其中包含 .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。
BULK INSERT with CHECK_CONSTRAINTS 子句。
插入到 ... 選擇 * 從 OPENROWSET(BULK ...)中,沒有 IGNORE_CONSTRAINTS 子句。
除非 FileTable 系統定義的條件約束已停用,否則不會強制執行條件約束的大量載入作業會失敗。 此類別包括以下作業:
BCP 不帶有 CHECK_CONSTRAINTS 子句。
不含 CHECK_CONSTRAINTS 子句的 BULK INSERT。
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 ...)
使用 IGNORE_CONSTRAINTS 子句進行調用。
停用 FileTable 命名空間,不使用 IGNORE_CONSTRAINTS 子句。 然後重新啟用 FileTable 命名空間。
如需停用 FileTable 條件約束的詳細資訊,請參閱 管理 FileTables。
如何操作:解除大量載入的 FileTable 限制
為了避免在批量載入檔案至 FileTable 時執行系統定義的限制,您可暫時停用這些限制。 如需詳細資訊,請參閱 管理 FileTables。