StefanSinapov
8/8/2017 - 11:58 AM

Copy folder content to other folder

Copy folder content to other folder


DECLARE @SourceTenderId INT = 6043
DECLARE @SourceFolderId INT = 151988

DECLARE @DestinationTenderId INT = 6044
DECLARE @DestionationRootFolderId INT = 152001

BEGIN TRANSACTION;  

BEGIN TRY  
   

 DECLARE @oldDocuments TABLE (parentId INT , docId INT, docGuid UNIQUEIDENTIFIER, newDocId INT, [Level] INT, [OwnerId] INT);

	-- Insert recursively folders and documents uploded by Buyers in the Tender Root folder
	;WITH [DocumentsToCopy]([ParentId], [DocumentId], [DocumentGuid], [Level], [OwnerId]) AS
	(
		SELECT
			 @DestionationRootFolderId
			,D.[DocumentId]
			,D.[DocumentGuid]
			,1 AS [Level]
			,[OwnerId]
		FROM [dbo].[Documents] D
			INNER JOIN [dbo].[Users] U ON U.[UserId] = D.[OwnerId]
			INNER JOIN [dbo].[TenderCompanies] TC ON TC.[TenderId] = @SourceTenderId AND TC.[CompanyId] = U.[CompanyId] AND TC.[RoleId] = 2/*Buyer*/
		WHERE [ParentId] = @SourceFolderId
			AND NOT EXISTS (SELECT DL.[DocumentLinkId] FROM [dbo].[DocumentLinks] DL WHERE DL.[DocumentId] = D.[DocumentId])
		
		UNION ALL
		
		SELECT
			 D.[ParentId]
			,D.[DocumentId]
			,D.[DocumentGuid]
			,[DocumentsToCopy].[Level] + 1 AS [Level]
			,D.[OwnerId]
		FROM [dbo].[Documents] D
			INNER JOIN [DocumentsToCopy] ON [DocumentsToCopy].[DocumentId] = D.[ParentId]
			INNER JOIN [dbo].[Users] U ON U.[UserId] = D.[OwnerId]
			INNER JOIN [dbo].[TenderCompanies] TC ON TC.[TenderId] = @SourceTenderId AND TC.[CompanyId] = U.[CompanyId] AND TC.[RoleId] = 2/*Buyer*/
		WHERE NOT EXISTS (SELECT DL.[DocumentLinkId] FROM [dbo].[DocumentLinks] DL WHERE DL.[DocumentId] = D.[DocumentId])
	)

	INSERT INTO @oldDocuments
	(
		 parentId
		,docId
		,docGuid
		,[Level]
			,[OwnerId]
	)
	SELECT
			 DTC.[ParentId]
			,DTC.[DocumentId]
			,DTC.[DocumentGuid]
			,DTC.[Level]
			,DTC.[OwnerId]
	FROM [DocumentsToCopy] DTC

	SELECt * FROM @oldDocuments


	--Insert new documents
	DECLARE @CurrentDocId INT
	SET @CurrentDocId = (SELECT TOP 1 docId from @oldDocuments order by [Level] ASC)
		DECLARE @ParentId INT = NULL
	DECLARE @CurrentParentId INT = NULL	
		WHILE @CurrentDocId IS NOT NULL
		BEGIN
			SET @CurrentParentId = (SELECT parentId FROM @oldDocuments WHERE docId = @CurrentDocId)
	 
			  IF @CurrentParentId IS NOT NULL
			  BEGIN
				SET @ParentId = (select newDocId from @oldDocuments where docId = @CurrentParentId)
			  END
			  IF (SELECT [Level] from @oldDocuments WHERE docId = @CurrentDocId) = 1
			  BEGIN
				SET @ParentId = @DestionationRootFolderId
			  END
	
			DECLARE @NewDocumentId INT
  			DECLARE @NewDocumentGuid UNIQUEIDENTIFIER = NEWID()
				DECLARE @SourceBlobGuid UNIQUEIDENTIFIER;
			DECLARE @NewBlobGuid UNIQUEIDENTIFIER;
	
			SET @NewBlobGuid = NULL;
	
			--
			-- Get Document BlobGuid
			--
			SELECT @SourceBlobGuid = [BlobGuid]
			FROM [dbo].[Documents]
			WHERE ([DocumentId] = @CurrentDocId);

			--
			-- If Document has connectected Blob then copy it with new GUID
			--
			IF NOT @SourceBlobGuid IS NULL
			BEGIN
				SET @NewBlobGuid = NEWID();
	
				INSERT INTO [dbo].[BlobsSyn] 
					(BlobGuid, Data)
					SELECT @NewBlobGuid as BlobGuid, Data
					FROM [dbo].[BlobsSyn]
					WHERE BlobGuid = @SourceBlobGuid;
			END

			INSERT INTO [dbo].[Documents]
				(
				 [DocumentGuid]
				,[BlobGuid]
				,[Name]
				,[Extension]
				,[Description]
				,[Size]
				,[ParentId]
				,[ShortcutTargetId]
				,[IsFolder]
				,[OwnerId]
				,[LastModifiedDate]
				,[CreationDate]
				,[PreviousVersionId]
				,[IsPreviousVersion]
				,[IsShared]
				,[IsHidden]
				,[VisibleToBuyers]
				,[VisibleToSuppliers] 
				 )
			SELECT
				 @NewDocumentGuid
				,@NewBlobGuid
				,[Name]
				,[Extension]
				,[Description]
				,[Size]
				,@ParentId
				,[ShortcutTargetId]
				,[IsFolder]
				,[OwnerId]
				,GETUTCDATE()	
				,GETUTCDATE()	
				,NULL			
				,0	
				,[IsShared]
				,[IsHidden]
				,[VisibleToBuyers]
				,[VisibleToSuppliers]
			FROM [dbo].[Documents]
			WHERE ([DocumentId] = @CurrentDocId)

	
			SELECT @NewDocumentId = SCOPE_IDENTITY();
	
			UPDATE @oldDocuments
			SET newDocId = @NewDocumentId
			WHERE docId = @CurrentDocId
	
			SET @CurrentDocId = NULL
			SELECT TOP 1 @CurrentDocId = [docId] FROM @oldDocuments WHERE [newDocId] IS NULL order by [Level] ASC
			END


END TRY  
BEGIN CATCH  
    SELECT   
        ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_LINE() AS ErrorLine  
        ,ERROR_MESSAGE() AS ErrorMessage;  

    IF @@TRANCOUNT > 0  
        ROLLBACK TRANSACTION;  
END CATCH;  

IF @@TRANCOUNT > 0  
    COMMIT TRANSACTION;  
GO