USE [1forma] GO /****** Object: StoredProcedure [dbo].[Rename_File_In_DP] Script Date: 10.07.2020 15:11:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: <30.01.2020> -- Description: <Переименование файлов, вложенных в ДП файл> -- ============================================= ALTER PROCEDURE [dbo].[Rename_File_In_DP] @TaskID int = null, @SubcatID int = null, @ExtParamID int = null, @Mode varchar(max) = null, @UserID int = 3, @ErrorMessage varchar(1000) = null out AS BEGIN --declare @TaskID as int = 42398 --declare @ExtParamID as int = 240 --declare @Mode varchar(max) = 'test' declare @maping_DP as table (DP_ID int, Link varchar (100)) declare @FileID as int -- ID файла, чтобы постоянно его не вычислять declare @rep_str as varchar (100) = '' -- Строка, которая должна быть удалена из имени файла declare @new_name_str as varchar (100) = '' -- Строка, которая должна быть добавлена вместо даты времени declare @original_name as varchar (100) = '' -- Имя файла без ключей и версии. То имя, с которым вкладывает пользователь declare @str as nvarchar (max)='' -- Переменная, в которую будет сохранен код хранимой процедуры -- Служебные переменные для храненения данных в текстовом формате и использования в генерируемой хранимке declare @SubcatID_STR varchar (10) ='' declare @TaskID_STR varchar (10) ='' declare @ExtParamID_STR varchar (10) ='' ------------- -- Описываем какому ДП Файл соответствует Реквизит 1С -- Нужно для передачи файла в 1С insert into @maping_DP select 67, ' _ФайлДоговораАренды' union all select 529, ' _ФайлРасстановкиПромоутеров' ------------- -- Определяем режим выполнения: -- AddKey - добавляем ключи в имя файла -- DeleteKey - убираем ключи из имени файла и возвращаем первоначальное имя ------------- ------------- -- Блок Добавления ключей в имена файлов ------------- -- Вычисляем строку с датой, которую будем подменять set @rep_str = ' версия ' + format (getdate(), 'dd.MM.yyyy HH-mm') -- Вычисляем Новое имя файла. -- Выглядеть оно будет приблизительно так: SyncFrom1F ИмяФайла _ФотоРакурс2.jpeg select @new_name_str ='SyncFrom1F '+ replace (fsf.Name, fsf.Ext, mdp.Link + fsf.Ext), -- Имя файла с ключами @rep_str = fsf.Name, -- Имя файла с версией, которое необходимо удалить @FileID = fsf.FileId -- ID файла, чтобы постоянно его не вычислять from FileStorageFileToExtParamLinks as fsfe with (nolock) join FileStorageFiles as fsf with (nolock) on fsf.FileId = fsfe.FileId join @maping_DP as mdp on mdp.DP_ID = fsfe.ExtParamId where fsfe.TaskId = @taskid and fsfe.IsDeleted = 0 and fsfe.ExtParamId = @ExtParamID ------------- -- Блок добавления ключей имен файлов в БД ------------- if @Mode = 'AddKey' begin -- Меняем имя файла в хранилище файлов, вложенных в ДП -- Ищем неудаленный файл, т.к. это ДП, то это будет единственный файл, т.е. последний вложенный update fsf set fsf.Name = @new_name_str from FileStorageFiles as fsf with (nolock) where fsf.FileId = @FileID -- Меняем имя файла в таблице ДП ExtParamValues update epv set epv.ExtParamValue = replace (epv.ExtParamValue, @rep_str, @new_name_str) from ExtParamValues as epv with (nolock) where epv.TaskId = @taskid and epv.ExtParamId = @ExtParamID -- Меняем имя файла в таблице История версий файлов update fslfilv set fslfilv.Name = @new_name_str from FileStorageFileInfoLatestVersion as fslfilv with (nolock) where fslfilv.FileId = @FileID -- Записываем в строковые переменные значения числовых переменных, чтобы постоянно не конвертировать -- ID категории select @subcatid_STR = cast(t.subcatid as varchar (10)) from tasks as t with (nolock) where t.TaskID = @taskid -- ID ДП файл, в который его только что вложили set @ExtParamID_STR = cast (@ExtParamID as varchar (10)) -- ID Задачи set @TaskID_STR = cast (@TaskID as varchar (10)) -- Записываем в переменную код запроса для изменения имени файла в денормализованной таблице set @str = N' update t'+ @SubcatID_STR +' set t'+ @SubcatID_STR +'.extparam'+ @ExtParamID_STR +'value = replace (t'+ @SubcatID_STR +'.extparam'+ @ExtParamID_STR +'value, '''+ @rep_str +''', '''+ @new_name_str +''') from FileStorageFileToExtParamLinks as fsfe with (nolock) join TasksInSubcat'+ @SubcatID_STR +'Denormalized as t'+ @SubcatID_STR +' with (nolock) on t'+ @SubcatID_STR +'.taskid = fsfe.TaskId where fsfe.TaskId = '+ @TaskID_STR +' and fsfe.IsDeleted = 0 and fsfe.ExtParamId = '+ @ExtParamID_STR exec sp_executesql @statement = @str end ------------- -- Блок удаления ключей из имени файла ------------- if @Mode = 'DeleteKey' begin select @original_name = replace ( replace (fsf.Name, mdp.Link,''), 'SyncFrom1F ','') -- Имя файла без ключей from FileStorageFiles as fsf with (nolock) join @maping_DP as mdp on mdp.DP_ID = @ExtParamID where fsf.FileId = @FileID update fsf set fsf.Name = @original_name from FileStorageFileToExtParamLinks as fsfe with (nolock) join FileStorageFiles as fsf with (nolock) on fsf.FileId = fsfe.FileId where fsfe.TaskId = @taskid and fsfe.IsDeleted = 0 and fsfe.ExtParamId = @ExtParamID -- Меняем имя файла в таблице ДП ExtParamValues update epv set epv.ExtParamValue = replace (epv.ExtParamValue, @rep_str, @original_name) from FileStorageFileToExtParamLinks as fsfe with (nolock) join ExtParamValues as epv with (nolock) on epv.TaskID = fsfe.TaskId and epv.ExtParamID = fsfe.ExtParamId where fsfe.TaskId = @taskid and fsfe.IsDeleted = 0 and fsfe.ExtParamId = @ExtParamID -- Меняем имя файла в таблице История версий файлов update fslfilv set fslfilv.Name = @original_name from FileStorageFileToExtParamLinks as fsfe with (nolock) join FileStorageFileInfoLatestVersion as fslfilv with (nolock) on fslfilv.FileId = fsfe.FileId where fsfe.TaskId = @taskid and fsfe.IsDeleted = 0 and fsfe.ExtParamId = @ExtParamID -- Записываем в строковые переменные значения числовых переменных, чтобы постоянно не конвертировать -- ID категории select @subcatid_STR = cast(t.subcatid as varchar (10)) from tasks as t with (nolock) where t.TaskID = @taskid -- ID ДП файл, в который его только что вложили set @ExtParamID_STR = cast (@ExtParamID as varchar (10)) -- ID Задачи set @TaskID_STR = cast (@TaskID as varchar (10)) -- Записываем в переменную код запроса для изменения имени файла в денормализованной таблице set @str = N' update t'+ @SubcatID_STR +' set t'+ @SubcatID_STR +'.extparam'+ @ExtParamID_STR +'value = replace (t'+ @SubcatID_STR +'.extparam'+ @ExtParamID_STR +'value, '''+ @rep_str +''', '''+ @original_name +''') from FileStorageFileToExtParamLinks as fsfe with (nolock) join TasksInSubcat'+ @SubcatID_STR +'Denormalized as t'+ @SubcatID_STR +' with (nolock) on t'+ @SubcatID_STR +'.taskid = fsfe.TaskId where fsfe.TaskId = '+ @TaskID_STR +' and fsfe.IsDeleted = 0 and fsfe.ExtParamId = '+ @ExtParamID_STR exec sp_executesql @statement = @str end ------------- -- Блок тестирования ------------- if @Mode = 'Test' begin select @new_name_str as new_name_str, @rep_str as rep_str, @original_name as original_name end END