Поставили задачу, сделать скрипт для бекапа, чтобы все базы разкладывал по папочкам и папочки были даты.
USE Master;
GO
SET NOCOUNT ON
DECLARE @DBName nvarchar(500)
DECLARE @DBName_folder nvarchar(500)
DECLARE @DBDate_folder nvarchar(500)
DECLARE @Server nvarchar(500)
DECLARE @Server_folder nvarchar(500)
DECLARE @DataPath_backUp nvarchar(500)
DECLARE @LogPath nvarchar(500)
DECLARE @DBName_file nvarchar(500)
DECLARE @DirTree TABLE (subdirectory nvarchar(255), depth INT)
DECLARE @DirTree_date TABLE (subdirectory nvarchar(255), depth INT)
--Путь к внешнему источнику(хранилишю)
SET @DataPath_backUp = '\\ServerBackup\1c-backups\'
--Получаем дерево всех папок
INSERT INTO @DirTree(subdirectory, depth)
EXEC master.sys.xp_dirtree @DataPath_backUp
--Делаем имя папки текущую дату
set @DataPath_backUp = @DataPath_backUp + '\' + Convert(varchar(8), GETDATE(), 112)
--Проверяем есть ли такая папка, если нет то создаем
IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = Convert(varchar(8), GETDATE(), 112))
EXEC master.dbo.xp_create_subdir @DataPath_backUp
--Делаем дерево всех папок вложеных в папку день(это уже базы)
INSERT INTO @DirTree_date(subdirectory, depth)
EXEC master.sys.xp_dirtree @DataPath_backUp
--Делаем запрос в SQL всех баз для бекапа, я делал запрос по модели восстановления - полная
DECLARE @CURSOR CURSOR
SET @CURSOR = CURSOR SCROLL
for (SELECT name FROM sys.databases
where service_broker_guid <> '00000000-0000-0000-0000-000000000000' and recovery_model_desc = 'FULL')
OPEN @CURSOR
FETCH NEXT FROM @CURSOR INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
--перебераем базы и создаем папки
set @DBName_folder = @DataPath_backUp + '\'+ @DBName
IF NOT EXISTS (SELECT 1 FROM @DirTree_date WHERE subdirectory = @DBName)
begin
EXEC master.dbo.xp_create_subdir @DBName_folder
end
set @DBName_file = @DBName_folder +'\'+ @DBName + '_' + Convert(varchar(8), GETDATE(), 112)+ '.bak'
--код самого бекапа
BACKUP DATABASE @DBName TO DISK = @DBName_file WITH NOFORMAT, NOINIT, NAME = @DBName, COMPRESSION, SKIP, NOREWIND, NOUNLOAD, STATS = 10
--
FETCH NEXT FROM @CURSOR INTO @DBName
END
-- очищаем данные
DELETE FROM @DirTree
DELETE FROM @DirTree_date