使用MOVE确定DB RESTORE的SQL数据路径

时间:2010-01-06 16:19:56

标签: sql sql-server tsql

我正在尝试编写一个自动恢复数据库备份的脚本。我知道我可以使用以下RESTORE命令:

RESTORE DATABASE [DBRestoredName] 
FROM  DISK = N'C:\path\to\backup.bak' 
WITH  FILE = 1,  
MOVE N'DBNAME' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\DBNAME.mdf',  
MOVE N'DBNAME_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\DBNAME.ldf',  
NOUNLOAD

这个问题是我希望能够在运行时确定SQL服务器的数据位置(即TO路径),以便将恢复的数据库与此服务器上的其他数据库一致地放置。

正在恢复的服务器上将不存在正在恢复的数据库,我需要MOVE语句,因为源服务器很可能是SQL Server 2005,目标是2008,因此备份文件中包含的文件路径是不可取。

那么我可以通过哪种方式以编程方式确定SQL数据位置?

3 个答案:

答案 0 :(得分:2)

我发现唯一可行的解​​决方案是从您的T-SQL代码检查注册表:

DECLARE @filepath NVARCHAR(260)

EXEC master.dbo.xp_instance_regread 
        N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', 
        N'DefaultData', 
        @filepath output, 'no_output' 

SELECT @filepath as 'Your default data directory'

我本可以发誓,数据路径会存储在SERVERPROPERTY或动态管理视图(DMV)中 - 但没有运气......

答案 1 :(得分:1)

您可以从要在物理上还原的数据库的sys.database_files视图中进行查询。您必须从physical_name列的末尾剥离文件名。

select * from sys.database_files

答案 2 :(得分:0)

下面的代码片段是我从SQL事件探查器中提取的内容。我修改了一下以删除不太有用的列。代码现在返回一个包含以下列的行:

  • IsFullTextInstalled
  • MasterDBLogPath
  • MasterDBPath
  • ErrorLogPath
  • RootDirectory
  • IsCaseSensitive
  • MaxPrecision
  • VersionString(例如10.50.2500.0)
  • 版本(例如开发人员版(64位))
  • ProductLevel(例如SP1)
  • IsSingleUser
  • EngineEdition(例如3)
  • 整理(例如Latin1_General_CI_AS)
  • IsClustered
  • NetName(例如您的主机名)
  • BuildClrVersionString(例如v2.0.50727)
祝你好运。

declare @RegPathParams sysname
declare @Arg sysname
declare @Param sysname
declare @MasterPath nvarchar(512)
declare @LogPath nvarchar(512)
declare @ErrorLogPath nvarchar(512)
declare @n int

select @n=0
select @RegPathParams=N'Software\Microsoft\MSSQLServer\MSSQLServer'+'\Parameters'
select @Param='dummy'
while(not @Param is null)
begin
    select @Param=null
    select @Arg='SqlArg'+convert(nvarchar,@n)

    exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', @RegPathParams, @Arg, @Param OUTPUT
    if(@Param like '-d%')
    begin
        select @Param=substring(@Param, 3, 255)
        select @MasterPath=substring(@Param, 1, len(@Param) - charindex('\', reverse(@Param)))
    end
    else if(@Param like '-l%')
    begin
        select @Param=substring(@Param, 3, 255)
        select @LogPath=substring(@Param, 1, len(@Param) - charindex('\', reverse(@Param)))
    end
    else if(@Param like '-e%')
    begin
        select @Param=substring(@Param, 3, 255)
        select @ErrorLogPath=substring(@Param, 1, len(@Param) - charindex('\', reverse(@Param)))
    end

    select @n=@n+1
end

declare @SmoRoot nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Setup', N'SQLPath', @SmoRoot OUTPUT

SELECT CAST(FULLTEXTSERVICEPROPERTY('IsFullTextInstalled') AS bit) AS [IsFullTextInstalled], @LogPath AS [MasterDBLogPath], @MasterPath AS [MasterDBPath], @ErrorLogPath AS [ErrorLogPath], @SmoRoot AS [RootDirectory], CAST(case when 'a' <> 'A' then 1 else 0 end AS bit) AS [IsCaseSensitive], @@MAX_PRECISION AS [MaxPrecision], SERVERPROPERTY(N'ProductVersion') AS [VersionString], CAST(SERVERPROPERTY(N'Edition') AS sysname) AS [Edition], CAST(SERVERPROPERTY(N'ProductLevel') AS sysname) AS [ProductLevel], CAST(SERVERPROPERTY('IsSingleUser') AS bit) AS [IsSingleUser], CAST(SERVERPROPERTY('EngineEdition') AS int) AS [EngineEdition], convert(sysname, serverproperty(N'collation')) AS [Collation], CAST(SERVERPROPERTY('IsClustered') AS bit) AS [IsClustered], CAST(SERVERPROPERTY(N'MachineName') AS sysname) AS [NetName], SERVERPROPERTY(N'BuildClrVersion') AS [BuildClrVersionString]