2011-01-20 16 views
9

Estoy tratando de obtener la ruta sin el nombre de archivo de ninguna base de datos. Tengo esto hasta ahora:Obtener ruta de archivo físico de cualquier base de datos

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 

Funciona cuando reviso mis bases de datos comunes, pero cuando lo probé en la base de datos maestra. Me sale esto:

C: \ Archivos de programa \ Microsoft SQL Server \

Sin embargo, el camino correcto es:

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

¿Por qué se pierda el resto de la ruta ?

Gracias por todo ayuda?

+0

También debe ser consciente de que una base de datos puede consistir en varios archivos, y cada uno de estos archivos puede estar en una ubicación diferente. Por lo tanto, puede no tener sentido hablar de * la ruta *, en lugar de * una ruta * o * todas las rutas * –

Respuesta

8

Su tipo de datos variables es demasiado pequeño.

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\ es de 72 caracteres.

Trate declare @db_name varchar (200)

1

porque @db_name se declara con una longitud de 50, así que cualquier cosa que beyound se trunca.

Aumenta el tamaño de @db_name y el problema está resuelto.

0

Su código debe tener en cuenta que otros grupos de archivos de la misma base de datos no pueden estar en la misma ruta. Por lo tanto, propongo que agregue la verificación:

...AND (data_space_id = 1) 

para recopilar la ruta del archivo del grupo de archivos PRIMARY. El código terminaría de esta manera:

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 

y se puede utilizar de esta manera:

SELECT DB_PATH(N'master') 
GO 
Cuestiones relacionadas