Я получил скрипт из сети, который вычисляет использование файлов данных и файлов журнала транзакций из определенного экземпляра SQL Server. Сценарий работает нормально, если нет имени базы данных с пробелами или он не слишком длинный. Однако, если имя базы данных имеет пробел или слишком длинное, я получаю сообщение об ошибке «Msg 911, Уровень 16, Состояние 1, Строка 1
Не удалось найти запись в системных базах данных для базы данных «Тест». Не найдено ни одной записи с таким именем. Убедитесь, что имя введено правильно. "В примере сообщения об ошибке" 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 в квадратные скобки?