我从网上获得了一个脚本,用于计算来自某个SQL Server实例的数据文件和事务日志文件的使用情况。如果没有具有空格的数据库名称或不太长,则脚本可以正常工作。但是,如果数据库名称有空格或太长,我收到错误消息“消息911,级别16,状态1,行1 无法在sysdatabases中找到数据库'Test'的条目。找不到具有该名称的条目。确保正确输入名称。“在示例错误消息中,'Test'的完整数据库名称为”Test DB“,其中包含空格。请参阅下面的代码:
--Script to calculate information about the Data Files
SET QUOTED_IDENTIFIER OFF
SET NOCOUNT ON
DECLARE @dbname varchar(50)
declare @string varchar(250)
set @string = ''
create table #datafilestats
( Fileid tinyint,
FileGroup1 tinyint,
TotalExtents1 dec (8, 2),
UsedExtents1 dec (8, 2),
[Name] varchar(50),
[FileName] sysname )
create table #dbstats
( dbname varchar(50),
FileGroupId tinyint,
FileGroupName varchar(25),
TotalSizeinMB dec (8, 2),
UsedSizeinMB dec (8, 2),
FreeSizeinPercent dec (8, 2))
DECLARE dbnames_cursor CURSOR FOR SELECT name FROM master..sysdatabases
OPEN dbnames_cursor
FETCH NEXT FROM dbnames_cursor INTO @dbname
WHILE (@@fetch_status = 0)
BEGIN
set @string = 'use ' + @dbname + ' DBCC SHOWFILESTATS'
insert into #datafilestats exec (@string)
insert into #dbstats (dbname, FileGroupId, TotalSizeinMB, UsedSizeinMB)
select @dbname, FileGroup1, sum(TotalExtents1)*64.0/1024.0,
sum(UsedExtents1)*64.0/1024.0
from #datafilestats group by FileGroup1
set @string = 'use ' + @dbname + ' update #dbstats set FileGroupName =
sysfilegroups.groupname from #dbstats, sysfilegroups where
#dbstats.FileGroupId = sysfilegroups.groupid and #dbstats.dbname =''' +
@dbname + ''''
exec (@string)
update #dbstats set FreeSizeinPercent = (TotalSizeinMB - UsedSizeinMB)/TotalSizeinMB*100 where
dbname = @dbname
truncate table #datafilestats
FETCH NEXT FROM dbnames_cursor INTO @dbname
END
CLOSE dbnames_cursor
DEALLOCATE dbnames_cursor
drop table #datafilestats
select * from #dbstats
drop table #dbstats
--Script to calculate information about the Transaction Log Files
create table #LogUsageInfo
( db_name varchar(50),
log_size dec (8, 2),
log_used_percent dec (8, 2),
status dec (7, 1) )
insert #LogUsageInfo exec ('dbcc sqlperf(logspace) with no_infomsgs')
select * from #LogUsageInfo
drop table #LogUsageInfo
在我的分析中,当达到“set @string ='use'+ @dbname +'DBCC SHOWFILESTATS'”行时,错误消息开始出现。我确实尝试执行命令
use Test DB
DBCC SHOWFILESTATS
我收到了上面提到的错误信息。但是,如果我执行命令
use [Test DB]
DBCC SHOWFILESTATS
它工作正常,我没有收到错误消息。
我的问题是脚本中是否有一种方法可以用变量@dbname括起方括号?
答案 0 :(得分:8)
答案 1 :(得分:2)
因为你正在构建字符串所以为什么不说
set @string = 'use [' + @dbname + '] DBCC SHOWFILESTATS'
答案 2 :(得分:0)
关于长数据库名称。看起来你必须声明@string varchar(250)的@dbname varchar(100)和@string varchar(250)的@string varchar(300)。 您需要在表定义(列dbname)中进行类似的更改。