2011-01-20 4 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 : \ 프로그램 Files \ Microsoft SQL Server를 \

그러나, 올바른 경로는 다음과 같습니다

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

동일한 데이터베이스의 다른 파일 그룹이 동일한 경로에있을 수 없다는 것을 코드에서 고려해야합니다. 그래서 당신이 검사를 추가 할 것을 제안합니다 : PRIMARY 파일 그룹의 파일 경로를 모으기 위해

...AND (data_space_id = 1) 

을 제안합니다. 코드는 이런 식으로 끝날 것 :

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 
관련 문제