sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan finder jeg databiblioteket for en SQL Server-instans?

Det afhænger af, om standardstien er indstillet til data og logfiler eller ej.

Hvis stien er angivet eksplicit ved Properties => Database Settings => Database default locations derefter gemmer SQL-serveren den på Software\Microsoft\MSSQLServer\MSSQLServer i DefaultData og DefaultLog værdier.

Men hvis disse parametre ikke er angivet eksplicit, bruger SQL-serveren data- og logstier til masterdatabasen.

Nedenfor er scriptet, der dækker begge tilfælde. Dette er en forenklet version af den forespørgsel, som SQL Management Studio kører.

Bemærk også, at jeg bruger xp_instance_regread i stedet for xp_regread , så dette script vil fungere for enhver forekomst, standard eller navngivet.

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

Du kan opnå samme resultat ved at bruge SMO. Nedenstående er C#-eksempel, men du kan bruge et hvilket som helst andet .NET-sprog eller 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;
}

Det er så meget enklere i SQL Server 2012 og nyere, forudsat at du har sat standardstier (hvilket sandsynligvis altid er en rigtig ting at gøre):

select 
    InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
    InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')


  1. PostgreSQL høj tilgængelighed med Master-Slave &Master-Master-arkitekturer

  2. Hvordan afinstallerer/fjerner jeg Oracle 11g (klient)?

  3. Hvordan kan jeg bestemme installerede SQL Server-instanser og deres versioner?

  4. Rækkemønstergenkendelse i SQL