【问题标题】:How to implement a for each loop in SQL如何在 SQL 中实现 for each 循环
【发布时间】:2019-11-15 13:00:08
【问题描述】:

如何在 SQL 中实现 for each 循环?

我正在寻找一种将 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;

【问题讨论】:

    标签: sql-server tsql dbo


    【解决方案1】:

    您可以通过这种方式使用循环。 您需要创建某种排名来遍历每一行,然后根据当前排名获取值。

    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 
    

    【讨论】:

    • @Guilder 我很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多