获取任何数据库的物理文件路径

时间:2011-01-20 13:03:26

标签: sql-server sql-server-2005 tsql

我试图从任何数据库获取没有文件名的路径。到目前为止我有这个:

declare @db_name varchar (50)

SELECT @db_name = physical_name FROM sys.master_files WHERE database_id = DB_ID(N'master') AND type_desc = 'ROWS'

set @db_name = REVERSE(RIGHT(REVERSE(@db_name),(LEN(@db_name)-CHARINDEX('\', REVERSE(@db_name),1))+1))

print @db_name

当我检查普通数据库但是在master数据库上尝试它时,它可以工作。我明白了:

  

C:\ Program Files \ Microsoft SQL Server \

但是,正确的路径是:

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\

为什么错过了剩下的路径?

感谢所有人的帮助?

3 个答案:

答案 0 :(得分:9)

您的变量数据类型太小。

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\是72个字符。

尝试declare @db_name varchar (200)

答案 1 :(得分:1)

因为声明@db_name的长度为50,所以任何beyound都会被截断。

增加@db_name的大小,问题就解决了。

答案 2 :(得分:0)

您的代码应考虑到同一数据库的另一个文件组不能位于同一路径中。所以我建议你添加检查:

...AND (data_space_id = 1)

用于收集PRIMARY文件组的文件路径。代码将以这种方式结束:

CREATE FUNCTION DB_PATH ( @database_name NVARCHAR(100) )
RETURNS NVARCHAR(500)
AS
BEGIN
  DECLARE @database_path NVARCHAR(500) = ''
  DECLARE @database_dir  NVARCHAR(500) = ''

  SELECT @database_path = physical_name FROM sys.master_files 
    WHERE database_id = DB_ID(@database_name) AND (data_space_id = 1) AND type_desc = 'ROWS'

  SET @database_dir = REVERSE(RIGHT(REVERSE(@database_path),(LEN(@database_path)-CHARINDEX('\', REVERSE(@database_path),1))+1))

    RETURN @database_dir
END
GO

你可以这样使用它:

SELECT DB_PATH(N'master')
GO