如何在 SQL 中实现 for each 循环
How to implement a for each loop in SQL
如何在 SQL 中实现 for each 循环?
我正在寻找一种方法来自动将 SQL Server 2019 的数据库备份到给定文件夹,名称语法如下:
<Date><DB Name>
我希望能够在一个临时文件中列出所有数据库 table:
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;
您可以通过这种方式使用循环。
您需要创建某种排名来遍历每一行,然后根据当前排名获取值。
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
如何在 SQL 中实现 for each 循环?
我正在寻找一种方法来自动将 SQL Server 2019 的数据库备份到给定文件夹,名称语法如下:
<Date><DB Name>
我希望能够在一个临时文件中列出所有数据库 table:
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;
您可以通过这种方式使用循环。 您需要创建某种排名来遍历每一行,然后根据当前排名获取值。
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