2011-01-20 16 views
9

Sto cercando di ottenere il percorso senza il nome file da qualsiasi database. Finora l'ho fatto:Ottieni percorso file fisico di qualsiasi database

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 

Funziona quando controllo i miei database ordinari ma quando li ho provati nel database master. Ottengo questo:

C: \ Programmi \ Microsoft SQL Server \

Tuttavia, il percorso corretto è:

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

Perché è mancare il resto del percorso ?

Grazie a tutti per qualsiasi aiuto?

+0

si dovrebbe anche essere consapevoli del fatto che una banca dati può essere composto da più file, e ognuno di questi file può essere in una posizione diversa. Quindi potrebbe non avere senso parlare di * path *, al contrario di * un percorso * o * di tutti i percorsi * –

risposta

8

Il tipo di dati variabile è troppo piccolo.

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\ è di 72 caratteri.

Prova declare @db_name varchar (200)

1

perché @db_name è dichiarata con una lunghezza di 50, quindi tutto ciò che beyound ottiene troncato.

Aumentare la dimensione di @ db_name e il problema è risolto.

0

Il codice deve tenere conto del fatto che altri filegroup dello stesso database non possono trovarsi nello stesso percorso. Quindi propongo di aggiungere il controllo:

...AND (data_space_id = 1) 

per la raccolta del percorso del file del gruppo di file PRIMARY. Il codice sarebbe finita in questo modo:

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 

e si può utilizzare in questo modo:

SELECT DB_PATH(N'master') 
GO 
Problemi correlati