2011-01-20 23 views
9

Herhangi bir veritabanından dosya adı olmadan yolu almaya çalışıyorum. Benim sıradan veritabanlarını kontrol ederkenHerhangi bir veritabanının fiziksel dosya yolu alın

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 

O inşaat ama asıl veritabanı üzerinde çalıştığımızda: Ben şimdiye kadar bu var.

: C: \ Program Files \ Microsoft SQL Server \

Ancak, doğru yol:

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

Neden yolun geri kalanını özledin mi bana böyle ?

Yardımlarınız için hepinize teşekkürler mi?

+0

Ayrıca veritabanı birden fazla dosya oluşabilir bilmelidir ve bu dosyaların her biri olabilir farklı bir yer. Bu nedenle, * yolun * yolunun * veya * yolların * aksine, yol * hakkında konuşmak mantıklı olmayabilir. –

cevap

8

Değişken veri tipiniz çok küçük.

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\ 72 karakterdir. @db_name 50 uzunluğunda bildirilmiş, böylece beyound şey kesiliyorsa çünkü

declare @db_name varchar (200)

1

deneyin.

@db_name boyutunu artırın ve sorun çözüldü.

0

Kodunuz, aynı veritabanının başka bir dosya grubunun aynı yolda bulunamayacağını hesaba katmalıdır. Bu nedenle, PRIMARY dosya grubunun dosya yolunu toplamak için

'u eklediğinizi önermekteyim. kod, bu şekilde biteceğini:

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 

Ve bu şekilde kullanabilirsiniz:

SELECT DB_PATH(N'master') 
GO