2011-01-20 10 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 

普通のデータベースをチェックしても、masterデータベースで試したときに動作します。

C:\ Program Files \ MicrosoftのSQLサーバ\

は、しかし、正しいパスは次のとおりです。

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

なぜそれがパスの残りの部分を逃した私はこれを取得します?

ありがとうございました。

+0

また、データベースが複数のファイルから構成されてもよいことに注意する必要があり、これらの各ファイルはですることができ別の場所。したがって、*パス*または*すべてのパスとは対照的に*パス*について話すのは理にかなっていないかもしれません* –

答えて

8

可変データ型が小さすぎます。

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\は72文字です。

@db_nameは50の長さで宣言されているので、そのbeyound何が切り捨てられますのでdeclare @db_name varchar (200)

1

を試してみてください。

@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 
関連する問題