求教:sql server 2005 中取得系统盘符的方法 exec master..xp_availablemedia 2exec xp_availablemedia 2 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 引用邹老大的贴--得到SQL中的各种目录 declare @path varchar(8000) --得到当前数据库的数据文件路径 select @path=rtrim(reverse(filename)) from sysfiles select @path=reverse(substring(@path,charindex('\',@path),8000)) select 数据文件目录=@path --得到SQL安装时设置的数据文件路径 select @path=rtrim(reverse(filename)) from master..sysfiles where name='master' select @path=reverse(substring(@path,charindex('\',@path),8000)) select SQL数据文件目录=@path --根据安装路径得到默认的备份目录: select @path=rtrim(reverse(filename)) from master..sysfiles where name='master' select @path=substring(@path,charindex('\',@path)+1,8000), @path=reverse(substring(@path,charindex('\',@path),8000))+'BACKUP\' select SQL默认备份目录=@path 2005下可以试试select left(filename,charindex(':',filename)) from sys.sysfiles wufeng4552 结果:C:\ -253972480 1 2D:\ -242536448 0 2E:\ 1643225088 0 2F:\ 520936448 0 2wufeng4552 的运行结果是系统的可用盘,不符要求,我要的是判断系统盘(比如我当前是C盘) fcuandy的结果也有局限(仅仅是得到数据库的安装盘符),如果数据库没建在系统盘下,结果就错了。 可能是我误导了fcuandy,在解释一下,我要取得是操作系统的系统盘盘符。 运行结果:C 7950D 3864E 1567F 496confei,还是不知那个是系统盘。 如果是获取操作系统安装路径或盘符的话,那么读取系统环境变量就可以了。windir 就是变量名。exec master..xp_cmdshell 'echo path %windir%' 如果要将结果存在变量中,那么这样就可以了。declare @t table(path varchar(1000))insert @t exec master..xp_cmdshell 'echo %windir%'declare @path varchar(1000)select top 1 @path=path from @t where path is not nullselect @path/*C:\WINDOWS*/ 欲将红色部分用windir变量代替,该如何写sql句,谢谢。exec master.dbo.xp_cmdshell 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -S (local) -U sa -P 123 -d test8 -ed' 好像直接用%windir%替换就行了 exec xp_cmdshell要求后面为常量,如果用变量套的话,那么exec嵌套就可以了。即,在第一个exec执行时,内部语句已是常量declare @t table(path varchar(1000))insert @t exec master..xp_cmdshell 'echo %windir%'declare @path varchar(1000)select top 1 @path=path from @t where path is not nullselect @pathexec ('exec master.dbo.xp_cmdshell ''' + @path + '\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -S (local) -U sa -P 123 -d test8 -ed''') 长见识了。问题得到圆满解决,感谢fcuandy,anovice以及热心回复的朋友们。最后采用答案:exec master.dbo.xp_cmdshell '%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -S (local) -U sa -P 123 -d test8 -ed' 如果你是想执行,而不是在sql中得到的话,确实直接用系统变量名代替就可以了,不必如此麻烦。系统变量名,可以打开我的电脑属性,高级,那里查看变量。 一个多表查询? Microsoft Office Visio for Enterprise Architects 怎么进行数据库的双向工程? 动态存储过程执行中让人纳闷的问题求教高手。 游标问题 MS-SQL查询语句 CASE WHEN 无法启动分布式事务的问题 请高手指点!!! 怎样删除数据库日志 英雄帖 合并行的问题 在存储过程里查询视图
declare @path varchar(8000)
--得到当前数据库的数据文件路径
select @path=rtrim(reverse(filename)) from sysfiles
select @path=reverse(substring(@path,charindex('\',@path),8000))
select 数据文件目录=@path
--得到SQL安装时设置的数据文件路径
select @path=rtrim(reverse(filename)) from master..sysfiles where name='master'
select @path=reverse(substring(@path,charindex('\',@path),8000))
select SQL数据文件目录=@path
--根据安装路径得到默认的备份目录:
select @path=rtrim(reverse(filename)) from master..sysfiles where name='master'
select @path=substring(@path,charindex('\',@path)+1,8000),
@path=reverse(substring(@path,charindex('\',@path),8000))+'BACKUP\'
select SQL默认备份目录=@path
C:\ -253972480 1 2
D:\ -242536448 0 2
E:\ 1643225088 0 2
F:\ 520936448 0 2
wufeng4552 的运行结果是系统的可用盘,不符要求,我要的是判断系统盘(比如我当前是C盘)
fcuandy的结果也有局限(仅仅是得到数据库的安装盘符),如果数据库没建在系统盘下,结果就错了。
运行结果:
C 7950
D 3864
E 1567
F 496
confei,还是不知那个是系统盘。
exec master..xp_cmdshell 'echo path %windir%'
insert @t exec master..xp_cmdshell 'echo %windir%'
declare @path varchar(1000)
select top 1 @path=path from @t where path is not null
select @path
/*
C:\WINDOWS
*/
exec master.dbo.xp_cmdshell 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -S (local) -U sa -P 123 -d test8 -ed'
即,在第一个exec执行时,内部语句已是常量declare @t table(path varchar(1000))
insert @t exec master..xp_cmdshell 'echo %windir%'
declare @path varchar(1000)
select top 1 @path=path from @t where path is not null
select @path
exec ('exec master.dbo.xp_cmdshell ''' + @path + '\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -S (local) -U sa -P 123 -d test8 -ed''')
问题得到圆满解决,感谢fcuandy,anovice以及热心回复的朋友们。
最后采用答案:
exec master.dbo.xp_cmdshell '%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -S (local) -U sa -P 123 -d test8 -ed'