ata\LearnFileTable_Log.ldf' ,
SIZE = 8128KB , MAXSIZE = 2097152KB , FILEGROWTH = 10%)
WITH FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'LearnFileTable')
GO
三、创建FileTable数据表
USE LearnFileTable
GO
CREATE TABLE MyFileTable01 AS FileTable
WITH
(
FileTable_Directory = 'MyFileTable01',
FileTable_Collate_Filename = database_default
);
GO
select * from [dbo].MyFileTable01;


注意,上图中的目录层次为:\\\\\\
请务必记住:在此实例级别 FILESTREAM 共享区(即本实例中的“NET2012”)下创建的目录层次结构是虚拟目录层次结构。 该层次结构存储于 SQL Server 数据库中,并且在物理上不在NTFS文件系统中表示。 访问FILESTREAM 共享区之下和其包含的 FileTable 中的文件和目录的所有操作都将被文件系统中嵌入的 SQL Server 组件拦截和处理。
此时,我们可以手动添加几个文件到该FileTable目录下:


重新查询:

USE LearnFileTable;
DECLARE @root nvarchar(100);
DECLARE @fullpath nvarchar(1000);
SELECT @root = FileTableRootPath();
SELECT @fullpath = @root + file_stream.GetFileNamespacePath()
FROM [dbo].MyFileTable01
WHERE name = N'DemoExcel.xlsx';
PRINT @fullpath;
GO
四、通过T-SQL创建FileTable目录
INSERT INTO dbo.MyFileTable01(name, is_directory)
SELECT 'MyDir01', 1;
select stream_id,file_stream,name,path_locator,is_directory from [dbo].MyFileTable01;
DECLARE @path HIERARCHYID
DECLARE @new_path VARCHAR(675)
SELECT @path = path_locator
FROM dbo.MyFileTable01
WHERE name = 'MyDir01'
SELECT @new_path = @path.ToString() +
CONVERT(VARCHAR(20), CONVERT(BIGINT, SUBSTRING(CONVERT(BINARY(16), NEWID()), 1, 6))) + '.' +
CONVERT(VARCHAR(20), CONVERT(BIGINT, SUBSTRING(CONVERT(BINARY(16), NEWID()), 7, 6))) + '.' +
CONVERT(VARCHAR(20), CONVERT(BIGINT, SUBSTRING(CONVERT(BINARY(16), NEWID()), 13, 4))) + '/'
INSERT INTO dbo.MyFileTable01(name, file_stream, path_locator)
SELECT N'空文件.txt', 0x, @new_path
--select stream_id,file_stream,name,path_locator,is_directory from [dbo].MyFileTable01
CREATE FUNCTION [dbo].[fnGetNewPathLocator]
(@child uniqueidentifier
,@parent hierarchyid = NULL)
RETURNS hierarchyid
AS
BEGIN
DECLARE @result hierarchyid,
@binId binary(16) = CONVERT(binary(16), @child);
SELECT @result = hierarchyid::Parse
(
COALESCE(@parent.ToString(), N'/') +
CONVERT(nvarchar, CONVERT(bigint, SUBSTRING(@binId, 1, 6))) + N'.' +
CONVERT(nvarchar, CONVERT(bigint, SUBSTRING(@binId, 7, 6))) + N'.' +
CONVERT(nvarchar, CONVERT(bigint, SUBSTRING(@binId, 13, 4))) + N'/'
);
RETURN @result;
END;
DECLARE @image1 VARBINARY(MAX)
--DECLARE @stream_id HIERARCHYID
DECLARE @path_locator HIERARCHYID
SELECT @image1 = CAST(bulkcolumn AS VARBINARY(MAX))
FROM OPENROWSET(BULK N'E:\Test\悲剧.jpg', SINGLE_BLOB) AS x
SELECT @path_locator=path_locator FROM dbo.MyFileTable01 WHERE name = 'MyDir01'
INSERT INTO dbo.MyFileTable01(name, file_stream, path_locator)
SELECT N'悲剧.jpg', @image1, [dbo].[fnGetNewPathLocator](NEWID(),@path_locator) as NewPath
select stream_id,file_stream,name,path_locator,parent_path_locator,is_directory from [dbo].MyFileTable01;
注意:上面两种方法中,一个path_locator为Varchar,一个为HIERARCHYID。

特别限制:
15个级别的子目录,并且存储15个级别的子目录时,最下面的一级不能包含文件,因为这些文件将代表另外一个附加的级别。
windows="" /> 260个字符限制的路径名。因此,使用Transact-SQL在 FileTable的文件层次结构中创建的文件有可能无法使用Windows资源管理器或很多其他Windows应用程序查看或打开,原因是这些文件的完整路径名称超过了260个字符。但是,您可使用 Transact-SQL继续访问这些文件。