我正在尝试编写一个脚本,该脚本可以自动还原数据库备份。我知道我可以使用以下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 Server的数据位置(即TO路径),以便将还原的数据库始终与该服务器上的其他数据库并排放置。
要还原的数据库在要还原到的服务器上将不存在,并且我需要MOVE语句,因为源服务器可能是SQL Server 2005,而目标服务器是2008,因此备份文件中包含的文件路径是不可取的。
那么,我可以通过哪些方式以编程方式确定SQL数据位置?
我发现的唯一可行的解决方案是从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)中的某个位置-但是没有运气......
SERVERPROPERTY
更新 :正如@Mike所指出的那样-在SQL Server 2012 及更高版本中,该信息可以通过以下方式获得SERVERPROPERTY:
SELECT DefaultDataPath = SERVERPROPERTY('InstanceDefaultDataPath'), DefaultLogPath = SERVERPROPERTY('InstanceDefaultLogPath')