如何将SQL Server文件表目录及其内容递归复制到另一个目录?

时间:2018-07-10 15:02:02

标签: sql-server sql-server-2014 filestream filetable

我有一个SQL Server 2014 FileTable,其中包含目录和文件。我的任务是编写一个存储过程,该过程将目录及其所有内容以递归方式从FileTable中的一个位置复制到另一个位置。但是,这是针对ASP.NET Web应用程序的,因此,如果不可能执行存储过程或存储过程太复杂,我可以实施其他解决方案,可能涉及使用UNC路径复制文件。

首先,这有可能吗?与我一起工作的某人认为您无法复制文件流blob。

无论如何,如果可能,您将如何处理?

这是我创建表的脚本:

CREATE TABLE [dbo].[DocLibrary] AS FILETABLE ON [PRIMARY] FILESTREAM_ON [DSTKOL_FileGroup]
WITH
(
FILETABLE_DIRECTORY = N'DocLibrary', FILETABLE_COLLATE_FILENAME = SQL_Latin1_General_CP1_CI_AS, 
FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME=[UQ_DocLibrary_stream_id]
)

ALTER TABLE [dbo].[DocLibrary]  WITH CHECK ADD  CONSTRAINT [CK_DocLibrary_NoRootFiles] CHECK  (([is_directory]=(1) OR [path_locator].[GetLevel]()>(2)))

ALTER TABLE [dbo].[DocLibrary] CHECK CONSTRAINT [CK_DocLibrary_NoRootFiles]

这是到目前为止我所拥有的存储过程:

CREATE PROCEDURE [dbo].[procCopyItemDocLibrary]
    @SourcePath varchar(max),
    @DestPath varchar(max)
AS
BEGIN
    BEGIN TRANSACTION;

    DECLARE @SuccessCode int = 0;
    DECLARE @SourceItemId hierarchyid = GETPATHLOCATOR(FILETABLEROOTPATH('DocLibrary') + @SourcePath);

    IF @SourceItemId IS NOT NULL
    BEGIN
        DECLARE @DestParentId hierarchyid = GETPATHLOCATOR(FILETABLEROOTPATH('DocLibrary') + @DestPath);

        IF @DestParentId IS NOT NULL
        BEGIN

            DECLARE @FolderName varchar(max);

            SELECT @FolderName = name FROM dbo.DocLibrary WHERE path_locator = @SourceItemId;

            DECLARE @FOLDEREXISTS BIT = dbo.funcCheckExistsDocLibrary(@DestParentId, @FolderName);

            IF @FOLDEREXISTS = 0
            BEGIN
                DECLARE @SourceParentId hierarchyid = @SourceItemId.GetAncestor(1);

                -- ???
            END
            ELSE SET @SuccessCode = 3;
        END
        ELSE SET @SuccessCode = 2;
    END
    ELSE SET @SuccessCode = 1;

    COMMIT TRANSACTION;

    RETURN @SuccessCode;
END

0 个答案:

没有答案