載入檔案至 FileTable

適用於:SQL Server

描述如何載入或移轉檔案至 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 函式可協助您達成此目標。

在此範例中,假設存在現有的資料庫資料表 PhotoMetadata,其中包含相片的相關資料。 這個資料表中有一個 UNCPath 類型的 資料行,其中包含對應至 .jpg 檔案的實際 UNC 路徑。

若要將影像檔從檔案系統移轉至 FileTable,您必須進行下列動作:

  1. 建立新的 FileTable 以保存該檔案。 這個範例使用資料表名稱 dbo.PhotoTable,但並未顯示建立資料表的程式碼。

  2. 使用 xcopy 或類似的工具,將 .jpg 檔案及其目錄結構複製到 FileTable 的根目錄中。

  3. 使用以下示例類似的程式碼,修復 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 進行。 此類別包括以下作業:

    • bcp 搭配 CHECK_CONSTRAINTS 子句。
    • BULK INSERT 搭配 CHECK_CONSTRAINTS 子句。
    • INSERT INTO ... SELECT * FROM OPENROWSET(BULK ...) 沒有 IGNORE_CONSTRAINTS 子句。
  • 除非已停用 FileTable 系統定義的條件約束,否則不強制執行條件約束的 FileTable 大量載入作業將會失敗。 此類別包括以下作業:

    • bcp 沒有 CHECK_CONSTRAINTS 子句。
    • BULK INSERT 沒有 CHECK_CONSTRAINTS 子句。
    • INSERT INTO ... SELECT * FROM OPENROWSET(BULK ...) 搭配 IGNORE_CONSTRAINTS 子句。

如何:將檔案大量載入 FileTable

您可以使用各種方法將檔案大量載入 FileTable:

使用子句 CHECK_CONSTRAINTS 進行呼叫。

停用 FileTable 命名空間,且不使用 CHECK_CONSTRAINTS 子句進行呼叫。 然後重新啟用 FileTable 命名空間。

如需停用 FileTable 條件約束的詳細資訊,請參閱 管理 FileTables。

如何停用 FileTable 的限制條件以進行大量載入

為了避免在批量載入檔案至 FileTable 時執行系統定義的限制,您可暫時停用這些限制。 如需詳細資訊,請參閱 管理 FileTables。