Как реализовать для каждого цикла в SQL - PullRequest
1 голос
/ 04 июля 2019

Как реализовать для каждого цикла в SQL?

Я ищу способ автоматизировать резервное копирование баз данных для SQL Server 2019 в заданную папку со следующим синтаксисом имени:

<Date><DB Name>

Я надеюсь, что смогу получить список всех баз данных во временной таблице:

DECLARE @DBList TABLE (DBName VARCHAR(40))

INSERT INTO @DBList 
    SELECT name 
    FROM master.dbo.sysdatabases

и затем запустите каждую функцию агентов записи.

Сейчас я так и делаю. Это работает - грубое нарушение принципа однократной записи

-- Initialize variables
DECLARE @Date NVARCHAR(MAX) = CONVERT(VARCHAR, GETDATE(), 112);
DECLARE @DBName SYSNAME;
DECLARE @Path NVARCHAR(MAX);

USE [master];

-- BackUp Database
SET @DBName = 'DATABASE01';
SET @Path = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\' + @Date + @DBName +'.bak';
BACKUP DATABASE @DBName TO DISK = @Path;

SET @DBName = 'DATABASE02';
SET @Path = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\' + @Date + @DBName +'.bak';
BACKUP DATABASE @DBName TO DISK = @Path;

SET @DBName = 'DATABASE03';
SET @Path = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\' + @Date + @DBName +'.bak';
BACKUP DATABASE @DBName TO DISK = @Path;

SET @DBName = 'DATABASE04';
SET @Path = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\' + @Date + @DBName +'.bak';
BACKUP DATABASE @DBName TO DISK = @Path;

SET @DBName = 'DATABASE05';
SET @Path = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\' + @Date + @DBName +'.bak';
BACKUP DATABASE @DBName TO DISK = @Path;

1 Ответ

2 голосов
/ 04 июля 2019

Вы можете использовать цикл таким образом. Вам нужно создать какое-то ранжирование, чтобы пройти через каждую строку, а затем получить значение на основе текущего ранга.

DECLARE @DBList TABLE (DBName varchar(40),rankvalue int)
insert into @DBList SELECT name, DENSE_RANK() over (order by name) rankval FROM master.dbo.sysdatabases


 Declare @Date NVARCHAR(max) = convert(varchar, getdate(), 112);
DECLARE @DBName SYSNAME;
DECLARE @Path NVARCHAR(MAX);
 Declare @current int = 1   , @maxvalue int =(select max(rankvalue) from  @DBList) 


while @current <= @maxvalue 
begin 
Set @DBName =  (select DBName  from @DBList where rankvalue = @current)
Set @Path = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\' + @Date + @DBName +'.bak';
BACKUP DATABASE @DBName TO DISK = @Path   
set @current = @current + 1 
end 
...