Cela dépend si le chemin par défaut est défini pour les données et les fichiers journaux ou non.
Si le chemin est défini explicitement dans Properties
=> Database Settings
=> Database default locations
puis le serveur SQL le stocke dans Software\Microsoft\MSSQLServer\MSSQLServer
dans DefaultData
et DefaultLog
valeurs.
Cependant, si ces paramètres ne sont pas définis explicitement, le serveur SQL utilise les chemins de données et de journal de la base de données principale.
Voici le script qui couvre les deux cas. Il s'agit d'une version simplifiée de la requête exécutée par SQL Management Studio.
Notez également que j'utilise xp_instance_regread
au lieu de xp_regread
, donc ce script fonctionnera pour n'importe quelle instance, par défaut ou nommée.
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
Vous pouvez obtenir le même résultat en utilisant SMO. Ci-dessous est un exemple C#, mais vous pouvez utiliser n'importe quel autre langage .NET ou 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;
}
C'est tellement plus simple dans SQL Server 2012 et supérieur, en supposant que vous ayez défini des chemins par défaut (ce qui est probablement toujours une bonne chose à faire) :
select
InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')