SQL 带有数据库名称参数的服务器还原过程
SQL Server restore proc with database name parameter
正在寻找从 .bak 文件恢复的存储过程,但希望能够输入数据库名称作为参数,即 Exec sp_restore @dbname
- 所有数据库的 .bak 路径都是相同的,即所有数据库都是同一生产备份的开发副本。
- 每个 .mdf 和 .ldf 将与数据库本身具有相同的名称,即
dbname = @dbname
、mdf = D:\data\@dbname.mdf
、ldf =D:\data\@dbname.ldf
- .mdf 和 .ldf 的路径对于每个数据库都是相同的,即
D:\data\@dbname.mdf
使用 Sql Server Management Studio,您可以开始执行还原操作。在完成任务之前,您应该能够看到一个 "Script" 按钮。这将创建一个脚本,其中包含您手动输入的所有参数,包括 mdf 和 ldf 位置。然后您可以保存此脚本并随意执行它。您还可以修改生成的脚本,使数据库名称成为输入变量。你真的可以做任何事。是 SQL!
恢复数据库并更改 mdf 和 ldf 文件位置的示例脚本如下所示:
RESTORE DATABASE [example] FROM DISK = N'E:\Backup\example.BAK' WITH FILE = 1, MOVE N'ExampleData' TO N'E:\dbfiles\example.mdf', MOVE N'example_log' TO N'E:\dbfiles\example.ldf', NOUNLOAD, STATS = 10
GO
您可以阅读有关 RESTORE statement
的更多信息
然后您可以将脚本插入到存储过程中:
CREATE PROCEDURE RestoreDb
-- Add the parameters for the stored procedure here
@dbName nvarchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
RESTORE DATABASE @dbName FROM DISK = N'C:\Data\MSSQL\Backup\lolwut.bak' WITH FILE = 1, NOUNLOAD, STATS = 10
END
GO
从 bak 文件@DeviceName 恢复数据库的过程。它适用于具有两个逻辑文件的数据库。
使用方法:
EXEC RestoreDb @dbName='qqq', @DeviceName = 'D:\temp\R.bak'
对不起我的英语,我会改进它。
CREATE PROCEDURE RestoreDb
@dbName NVARCHAR(50),
@DeviceName NVARCHAR(400)
AS
SET NOCOUNT ON
DECLARE @Cmd NVARCHAR(1000),
@DataLogicalName NVARCHAR(200),
@LogLogicalName NVARCHAR(200),
@DatabasePath NVARCHAR(200),
@DataPath NVARCHAR(300),
@LogPath NVARCHAR(300)
CREATE TABLE #Files
(
LogicalName nvarchar(128),
PhysicalName nvarchar(260),
[Type] char(1),
FileGroupName nvarchar(128),
Size numeric(20,0),
MaxSize numeric(20,0),
FileID bigint,
CreateLSN numeric(25,0),
DropLSN numeric(25,0),
UniqueID uniqueidentifier,
ReadOnlyLSN numeric(25,0) ,
ReadWriteLSN numeric(25,0),
BackupSizeInBytes bigint,
SourceBlockSize int,
FileGroupID int,
LogGroupGUID uniqueidentifier,
DifferentialBaseLSN numeric(25,0),
DifferentialBaseGUID uniqueidentifier,
IsReadOnly bit,
IsPresent bit,
TDEThumbprint varbinary(32)
)
SELECT @DatabasePath = 'D:\data\'
SELECT @DataPath = @DatabasePath + @dbName + '.mdf',
@LogPath = @DatabasePath + @dbName + '.ldf'
SELECT @Cmd = 'RESTORE FILELISTONLY
FROM DISK = ''' + @DeviceName + ''''
INSERT #Files
EXEC (@Cmd)
IF NOT EXISTS(SELECT 1 FROM #Files) GOTO ERRORFILES
IF (SELECT COUNT(*) FROM #Files) > 2 GOTO ERRORFILESCOUNT
SELECT @DataLogicalName = LogicalName
FROM #Files
WHERE [Type] = 'D'
SELECT @LogLogicalName = LogicalName
FROM #Files
WHERE [Type] = 'L'
RESTORE DATABASE @DbName
FROM DISK = @DeviceName
WITH
MOVE @DataLogicalName TO @DataPath,
MOVE @LogLogicalName TO @LogPath
GOTO EXITSTAT
ERRORFILES:
BEGIN
RAISERROR( 'The list of files contained in the backup set is empty', 16, 1 )
GOTO EXITSTAT
END
ERRORFILESCOUNT:
BEGIN
RAISERROR( 'The count of files contained in the backup set is more than two', 16, 1 )
GOTO EXITSTAT
END
EXITSTAT:
正在寻找从 .bak 文件恢复的存储过程,但希望能够输入数据库名称作为参数,即 Exec sp_restore @dbname
- 所有数据库的 .bak 路径都是相同的,即所有数据库都是同一生产备份的开发副本。
- 每个 .mdf 和 .ldf 将与数据库本身具有相同的名称,即
dbname = @dbname
、mdf = D:\data\@dbname.mdf
、ldf =D:\data\@dbname.ldf
- .mdf 和 .ldf 的路径对于每个数据库都是相同的,即
D:\data\@dbname.mdf
使用 Sql Server Management Studio,您可以开始执行还原操作。在完成任务之前,您应该能够看到一个 "Script" 按钮。这将创建一个脚本,其中包含您手动输入的所有参数,包括 mdf 和 ldf 位置。然后您可以保存此脚本并随意执行它。您还可以修改生成的脚本,使数据库名称成为输入变量。你真的可以做任何事。是 SQL!
恢复数据库并更改 mdf 和 ldf 文件位置的示例脚本如下所示:
RESTORE DATABASE [example] FROM DISK = N'E:\Backup\example.BAK' WITH FILE = 1, MOVE N'ExampleData' TO N'E:\dbfiles\example.mdf', MOVE N'example_log' TO N'E:\dbfiles\example.ldf', NOUNLOAD, STATS = 10
GO
您可以阅读有关 RESTORE statement
的更多信息然后您可以将脚本插入到存储过程中:
CREATE PROCEDURE RestoreDb
-- Add the parameters for the stored procedure here
@dbName nvarchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
RESTORE DATABASE @dbName FROM DISK = N'C:\Data\MSSQL\Backup\lolwut.bak' WITH FILE = 1, NOUNLOAD, STATS = 10
END
GO
从 bak 文件@DeviceName 恢复数据库的过程。它适用于具有两个逻辑文件的数据库。 使用方法:
EXEC RestoreDb @dbName='qqq', @DeviceName = 'D:\temp\R.bak'
对不起我的英语,我会改进它。
CREATE PROCEDURE RestoreDb
@dbName NVARCHAR(50),
@DeviceName NVARCHAR(400)
AS
SET NOCOUNT ON
DECLARE @Cmd NVARCHAR(1000),
@DataLogicalName NVARCHAR(200),
@LogLogicalName NVARCHAR(200),
@DatabasePath NVARCHAR(200),
@DataPath NVARCHAR(300),
@LogPath NVARCHAR(300)
CREATE TABLE #Files
(
LogicalName nvarchar(128),
PhysicalName nvarchar(260),
[Type] char(1),
FileGroupName nvarchar(128),
Size numeric(20,0),
MaxSize numeric(20,0),
FileID bigint,
CreateLSN numeric(25,0),
DropLSN numeric(25,0),
UniqueID uniqueidentifier,
ReadOnlyLSN numeric(25,0) ,
ReadWriteLSN numeric(25,0),
BackupSizeInBytes bigint,
SourceBlockSize int,
FileGroupID int,
LogGroupGUID uniqueidentifier,
DifferentialBaseLSN numeric(25,0),
DifferentialBaseGUID uniqueidentifier,
IsReadOnly bit,
IsPresent bit,
TDEThumbprint varbinary(32)
)
SELECT @DatabasePath = 'D:\data\'
SELECT @DataPath = @DatabasePath + @dbName + '.mdf',
@LogPath = @DatabasePath + @dbName + '.ldf'
SELECT @Cmd = 'RESTORE FILELISTONLY
FROM DISK = ''' + @DeviceName + ''''
INSERT #Files
EXEC (@Cmd)
IF NOT EXISTS(SELECT 1 FROM #Files) GOTO ERRORFILES
IF (SELECT COUNT(*) FROM #Files) > 2 GOTO ERRORFILESCOUNT
SELECT @DataLogicalName = LogicalName
FROM #Files
WHERE [Type] = 'D'
SELECT @LogLogicalName = LogicalName
FROM #Files
WHERE [Type] = 'L'
RESTORE DATABASE @DbName
FROM DISK = @DeviceName
WITH
MOVE @DataLogicalName TO @DataPath,
MOVE @LogLogicalName TO @LogPath
GOTO EXITSTAT
ERRORFILES:
BEGIN
RAISERROR( 'The list of files contained in the backup set is empty', 16, 1 )
GOTO EXITSTAT
END
ERRORFILESCOUNT:
BEGIN
RAISERROR( 'The count of files contained in the backup set is more than two', 16, 1 )
GOTO EXITSTAT
END
EXITSTAT: