Как заключить квадратные скобки в переменную, которая была задана как значение одной переменной в T-SQL? - PullRequest
1 голос
/ 22 апреля 2009

Я получил скрипт из сети, который вычисляет использование файлов данных и файлов журнала транзакций из определенного экземпляра 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 в квадратные скобки?

Ответы [ 3 ]

8 голосов
/ 22 апреля 2009

да, это называется QuoteName

Пример

select quotename('bb bb')
2 голосов
/ 22 апреля 2009

Поскольку вы строите строку, так почему бы не сказать

set @string = 'use [' + @dbname + '] DBCC SHOWFILESTATS'
0 голосов
/ 23 апреля 2009

Относительно длинных имен БД. Похоже, что вы должны объявить @dbname varchar (100), инстант из varchar (50) и @string varchar (300), инстант из @string varchar (250). И вам нужны аналогичные изменения в определениях таблиц (столбцы dbname).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...