2011-01-20 57 views
9

我想从任何数据库中获取没有文件名的路径。我到目前为止:获取任何数据库的物理文件路径

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 

它工作时,我检查我的普通数据库,但当我在主数据库上尝试它。我得到这个:

C:\ Program Files文件\ Microsoft SQL Server的\

但是,正确的路径是:

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

为什么会错过的路径的其余部分?

谢谢大家的帮助?

+0

你也应该知道,一个数据库可以由多个文件,而且这些文件可以在一个不同的位置。因此,讨论*路径*可能没有意义,而不是*路径*或*所有路径* – 2011-01-20 13:11:32

回答

8

您的变量数据类型太小。

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

尝试declare @db_name varchar (200)

1

因为@db_name宣布与50的长度,所以任何beyound是被截断。

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

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