Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да намеря директорията с данни за екземпляр на SQL Server?

Зависи дали пътят по подразбиране е зададен за данни и регистрационни файлове или не.

Ако пътят е зададен изрично в Properties => Database Settings => Database default locations след това SQL сървърът го съхранява в Software\Microsoft\MSSQLServer\MSSQLServer в DefaultData и DefaultLog стойности.

Въпреки това, ако тези параметри не са зададени изрично, SQL сървърът използва пътищата за данни и регистрационни файлове на основната база данни.

По-долу е скриптът, който обхваща и двата случая. Това е опростена версия на заявката, която 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')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlDataSourceEnumerator.Instance.GetDataSources() не намира локален екземпляр на SQL сървър 2008

  2. Вложен оператор за избор в SQL Server

  3. Разработки на виртуална машина Azure за използване на SQL Server

  4. ИЗБЕРЕТЕ DISTINCT на една колона

  5. 6 начина за свързване на низ и число в SQL Server