这取决于数据和日志文件是否设置了默认路径。
如果路径在 属性
=> 数据库设置
=> 数据库默认位置
中明确设置,则 SQL Server 将其存储在 Software\Microsoft\MSSQLServer\MSSQLServer
中的 DefaultData
和 DefaultLog
值中。
但是,如果这些参数没有被明确设置,SQL Server 将使用主数据库的数据和日志路径。
以下是涵盖两种情况的脚本。这是 SQL Management Studio 运行的查询的简化版本。
此外,请注意我使用的是 xp_instance_regread
而不是 xp_regread
,因此该脚本适用于任何实例,包括默认实例和命名实例。
declare @DefaultData nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', @DefaultData output
declare @DefaultLog nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', @DefaultLog output
declare @DefaultBackup nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', @DefaultBackup output
declare @MasterData nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg0', @MasterData output
select @MasterData=substring(@MasterData, 3, 255)
select @MasterData=substring(@MasterData, 1, len(@MasterData) - charindex('\', reverse(@MasterData)))
declare @MasterLog nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg2', @MasterLog output
select @MasterLog=substring(@MasterLog, 3, 255)
select @MasterLog=substring(@MasterLog, 1, len(@MasterLog) - charindex('\', reverse(@MasterLog)))
select
isnull(@DefaultData, @MasterData) DefaultData,
isnull(@DefaultLog, @MasterLog) DefaultLog,
isnull(@DefaultBackup, @MasterLog) DefaultBackup
使用SMO可以实现相同的结果。下面是C#示例,但您也可以使用任何其他.NET语言或PowerShell。
using (var connection = new SqlConnection("Data Source=.;Integrated Security=SSPI"))
{
var serverConnection = new ServerConnection(connection);
var server = new Server(serverConnection);
var defaultDataPath = string.IsNullOrEmpty(server.Settings.DefaultFile) ? server.MasterDBPath : server.Settings.DefaultFile;
var defaultLogPath = string.IsNullOrEmpty(server.Settings.DefaultLog) ? server.MasterDBLogPath : server.Settings.DefaultLog;
}
如果你在SQL Server 2012及以上版本中设置了默认路径(这通常是正确的做法),那么使用起来要简单得多:
select
InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')
C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies
中的程序集,例如Microsoft.SqlServer.Smo.dll
和Microsoft.SqlServer.ConnectionInfo.dll
。但是,如果您从未安装SQL Server的机器上连接,则需要安装SMO。搜索“Microsoft SQL Server 2012 Feature Pack”以查找独立的SMO安装程序。 - Alex AzaRegQueryValueEx()返回错误2,“系统找不到指定的文件。”
Msg 22001,Level 1,State 1
RegQueryValueEx()返回错误2,“系统找不到指定的文件。”
Msg 22001,Level 1,State 1
- Dima KorobskiyHKEY_LOCAL_MACHINE
中搜索了该关键字的所有路径,但没有任何版本的痕迹。并且尝试通过TSQL进行操作时,我遇到了与@DKroot相同的错误。我想我只能欺骗并使用主数据库文件的目录了。 - Jerry Dodge