设为首页 加入收藏

TOP

SQLServer2012新特性(1)T-SQL操作FileTable目录实例(三)
2014-11-23 22:20:20 来源: 作者: 【 】 浏览:30
Tags:SQLServer2012 特性 T-SQL 操作 FileTable 目录 实例
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继续访问这些文件。

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.SQL统计某张表的列数。 下一篇一道SQL题考你数据库的使用能力

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: