使用 FileTables 中的目錄與路徑

適用於:SQL Server

描述在 FileTable 中儲存檔案的目錄結構。

如何:使用 FileTables 中的目錄與路徑

您可使用下列三項函式,以便在 Transact-SQL 中使用 FileTable 目錄:

為得到此結果 使用此函數
取得特定 FileTable 或目前資料庫的根層級 UNC 路徑。 FileTableRootPath (Transact-SQL)
取得 FileTable 中檔案或目錄的絕對路徑或相對 UNC 路徑。 GetFileNamespacePath (Transact-SQL)
經由提供路徑的方法,取得 FileTable 中指定之檔案或目錄的路徑定位器識別碼值。 GetPathLocator (Transact-SQL)

使用可攜式程式碼的相對路徑

若要讓程式碼和應用程式獨立於目前的電腦和資料庫之外,請避免撰寫依賴絕對檔案路徑的程式碼。 相反地,同時使用 FileTableRootPath (Transact-SQL)GetFileNamespacePath (Transact-SQL) 函式,以取得檔案在執行階段的完整路徑,如下列範例所示。 根據預設,GetFileNamespacePath 函式會傳回資料庫根路徑之下的檔案相對路徑。

USE database_name;

DECLARE @root NVARCHAR(100);
DECLARE @fullpath NVARCHAR(1000);

SELECT @root = FileTableRootPath();

SELECT @fullpath = @root + file_stream.GetFileNamespacePath()
FROM filetable_name
WHERE name = N'document_name';

PRINT @fullpath;
GO

限制

巢狀層級

重要

您不能在 FileTable 目錄中儲存超過 15 層的子目錄。 當您儲存了 15 層的子目錄時,最低的一層將無法包含任何檔案,因為這些檔案代表另外的一層。

完整路徑名稱長度

重要

NTFS 檔案系統支援遠超過 Windows Shell 和大多數 Windows API 的 260 字元限制的路徑名稱。 因此,可以使用 Transact-SQL 建立 FileTable 檔案階層中完整路徑名稱超過 260 字元的檔案,但卻無法以 Windows 檔案總管或許多其他 Windows 應用程式檢視或開啟這些檔案。 不過,您可以繼續使用 Transact-SQL 存取這些檔案。

FileTable 中儲存之項目的完整路徑

FileTable 中儲存之檔案或目錄的完整路徑,由下列元素做為開頭:

  1. 在 SQL Server 執行個體層級為 FILESTREAM 檔 I/O 存取啟用共用。

  2. 在資料庫層級指定的 DIRECTORY_NAME

  3. 在 FileTable 層級指定的 FILETABLE_DIRECTORY

所產生的階層如下:

\\<machine>\<instance-level FILESTREAM share>\<database-level directory>\<FileTable directory>\

此目錄階層會形成 FileTable 檔案命名空間的根目錄。 在此目錄階層之下,FileTable 的 FILESTREAM 資料將會儲存為檔案,以及其下也可以再包含檔案與子目錄的子目錄。

請務必牢記,於此執行個體層級的 FILESTREAM 共用之下所建立的目錄階層,是一個虛擬的目錄階層。 此階層儲存於 SQL Server 資料庫,且不會實際於 NTFS 檔案系統呈現出來。 在 FILESTREAM 共用及其所包含的 FileTables,所有存取檔案與目錄的作業,都會由檔案系統內嵌的 SQL Server 元件加以攔截與處理。

執行個體、資料庫與 FileTable 層級上根目錄的語意

此目錄階層結構遵循下列語義:

  • 執行個體層級的 FILESTREAM 共用由管理員所設定,而且會儲存為伺服器屬性。 您可使用 SQL Server 組態管理員,重新命名此共用。 伺服器重新啟動之前重新命名操作不會生效。

  • 當您建立新的資料庫時,資料庫層級的 DIRECTORY_NAME 預設為 null。 管理員可使用 ALTER DATABASE 陳述式設定或變更此名稱。 該執行個體中的名稱不行重複 (不分大小寫)。

  • 一般來說,當您建立 FileTable 時,會提供 FILETABLE_DIRECTORY 名稱作為 CREATE TABLE 陳述式的一部分。 也可以使用 ALTER TABLE 命令變更此名稱。

  • 無法透過檔案 I/O 操作變更這些根目錄的名稱。

  • 無法以獨佔的檔案控制開啟這些根目錄。

FileTable 結構描述中的 is_directory 資料行

下表描述 is_directory 資料行以及與將 FILESTREAM 資料包含於 FileTable 中的 file_stream 資料行之間的互動。

is_directory 值 file_stream 值 行為
FALSE NULL 此為無效的組合,由系統定義的條件約束所攔截。
FALSE <value> 該項目代表檔案。
TRUE NULL 該項目代表目錄。
TRUE <value> 此為無效的組合,由系統定義的條件約束所攔截。

使用虛擬網路名稱 (VNN) 搭配 Always On 可用性群組

當包含 FILESTREAM 或 FileTable 資料的資料庫屬於可用性群組時: