我试图从任何数据库获取没有文件名的路径。到目前为止我有这个:
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 Server \
但是,正确的路径是:
C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\
为什么错过了剩下的路径?
感谢所有人的帮助?
答案 0 :(得分:9)
您的变量数据类型太小。
C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\
是72个字符。
尝试declare @db_name varchar (200)
答案 1 :(得分:1)
因为声明@db_name的长度为50,所以任何beyound都会被截断。
增加@db_name的大小,问题就解决了。
答案 2 :(得分: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