我有一个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