SQL Server 2012新特性(1)T-SQL操做FileTable目錄實例

    在SQL Server 2008提供FileStream,以藉助Windows系統自己的API來強化SQL Server對於非結構化數據的支持後,SQL Server 2012更是推出了像Contained Database、FileTable等使人期待的新功能。對於FileTable的功能和特性,在此無需贅述,本文主要針對FileTable的T-SQL操做目錄作一個實例演示。

關於FileTable的介紹,請參閱MSDN:http://technet.microsoft.com/zh-cn/library/ff929144.aspx

1、啓用FileTable的先決條件
http://technet.microsoft.com/zh-cn/library/gg509097.aspx

html

USE master GO
EXEC sp_configure 'filestream access level',2
Go
RECONFIGURE GO
--查看實例級FileTable配置
EXEC sp_configure filestream_access_level;
GO


2、建立一個FileTableweb

USE master
GO
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'LearnFileTable')
         DROP DATABASE LearnFileTable
GO
/****** Object:  Database [LearnFileTable]    Script Date: 2014-04-23 9:25:32 ******/
CREATE DATABASE [LearnFileTable]
 CONTAINMENT = NONE
 ON  PRIMARY
( NAME = N'LearnFileTable_Primary', FILENAME = N'E:\SQL2012Data\MyData\2012Data\LearnFileTable_Data.mdf' ,
SIZE = 8128KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
 FILEGROUP [MyFS] CONTAINS FILESTREAM  DEFAULT
( NAME = N'LearnFileFS', FILENAME = N'E:\SQL2012Data\MyData\2012Data\LearnFileFS' ,
 MAXSIZE = UNLIMITED)
 LOG ON
( NAME = N'LearnFileTable_Log', FILENAME = N'E:\SQL2012Data\MyData\2012Data\LearnFileTable_Log.ldf' ,
SIZE = 8128KB , MAXSIZE = 2097152KB , FILEGROWTH = 10%)
WITH FILESTREAM (NON_TRANSACTED_ACCESS   = FULL, DIRECTORY_NAME = N'LearnFileTable')
GO

邀月工做室


3、建立FileTable數據表sql

USE LearnFileTable
GO
CREATE TABLE MyFileTable01  AS FileTable
WITH
(
      FileTable_Directory =   'MyFileTable01',
      FileTable_Collate_Filename = database_default
);
GO

select * from [dbo].MyFileTable01;

邀月工做室

邀月工做室

注意,上圖中的目錄層次爲:\\<machine>\<instance-level FILESTREAM share>\<database-level directory>\<FileTable directory>\
(\\機器名\SQL實例名\FileTable數據庫目錄\FileTable目錄名)
 此目錄層次結構構成了 FileTable 的文件命名空間的根。 在此目錄層次結構下,FileTable 的 FILESTREAM 數據做爲文件存儲(包含文件和子目錄的子目錄)。

請務必記住:在此實例級別 FILESTREAM 共享區(即本實例中的「NET2012」)下建立的目錄層次結構是虛擬目錄層次結構。 該層次結構存儲於 SQL Server 數據庫中,而且在物理上不在NTFS文件系統中表示。 訪問FILESTREAM 共享區之下和其包含的 FileTable 中的文件和目錄的全部操做都將被文件系統中嵌入的 SQL Server 組件攔截和處理。 數據庫

此時,咱們能夠手動添加幾個文件到該FileTable目錄下:ide

邀月工做室

邀月工做室

從新查詢:函數

邀月工做室

注意:上圖並無根目錄以外的常見文件目錄結構,換句話說,都是位於根目錄下的「平級」文件。若是要獲取文件的完整路徑,這須要結合使用 FileTableRootPath (Transact-SQL) 和 GetFileNamespacePath (Transact-SQL) 函數查看完整路徑:spa

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目錄。3d


4、經過T-SQL建立FileTable目錄
這個過程咱們分兩步:
(1)建立一個新目錄code

INSERT INTO dbo.MyFileTable01(name, is_directory)
SELECT 'MyDir01', 1;
select stream_id,file_stream,name,path_locator,is_directory from [dbo].MyFileTable01;

邀月工做室
(2)插入一個空白文件到新目錄:orm

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

邀月工做室

若是你想使用SQL Server自己提供的hierarchyid層次結構,下面這個函數也許能夠幫你:

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

邀月工做室

邀月工做室
若是想更進一步,讓FileTable目錄顯示更加接近文件系統,能夠將系統stream_Id字段替換爲年+月+加標識符等,能夠看這裏的示例:
http://www.codeproject.com/Articles/584865/SQL-Server-FileTable-My-first-experience


特別限制
一、 FileTable目錄中不能存儲15個級別的子目錄,而且存儲15個級別的子目錄時,最下面的一級不能包含文件,由於這些文件將表明另一個附加的級別。
二、 NTFS 文件系統支持遠遠超過Windows外殼程序和大多數Windows API的260個字符限制的路徑名。所以,使用Transact-SQL在 FileTable的文件層次結構中建立的文件有可能沒法使用Windows資源管理器或不少其餘Windows應用程序查看或打開,緣由是這些文件的完整路徑名稱超過了260個字符。可是,您可以使用 Transact-SQL繼續訪問這些文件。

關於SQL Server 2008中新增的原生分層結構數據hierarchyid,請看這裏:
http://www.cnblogs.com/downmoon/archive/2011/05/03/2035259.html
http://msdn.microsoft.com/zh-cn/library/bb677173.aspx


本文參考文章:
http://www.codeproject.com/Articles/584865/SQL-Server-FileTable-My-first-experience
http://www.toadworld.com/platforms/sql-server/b/weblog/archive/2013/08/06/inserting-files-into-a-filetable-using-t-sql.aspx
http://www.cnblogs.com/zitjubiz/archive/2012/11/14/SQLSERVER_FileStream_FileTable.html

相關文章
相關標籤/搜索