如何将方括号括起到已在T-SQL中设置为一个变量值的变量?

tit*_*ium 1 t-sql sql-server

我从Net获得了一个脚本,用于计算来自某个SQL Server实例的数据文件和事务日志文件的使用情况.如果没有具有空格的数据库名称或不太长,则脚本可以正常工作.但是,如果数据库名称有空格或太长,我收到错误消息"消息911,级别16,状态1,行1无法在sysdatabases中找到数据库'测试'的条目.找不到具有该名称的条目.确保正确输入名称." 在示例错误消息中,"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
Run Code Online (Sandbox Code Playgroud)

在我的分析中,当达到"set @string ='use'+ @dbname +'DBCC SHOWFILESTATS'"行时,错误消息开始出现.我确实尝试执行命令

use Test DB
DBCC SHOWFILESTATS
Run Code Online (Sandbox Code Playgroud)

我收到了上面提到的错误信息.但是,如果我执行命令

use [Test DB]
DBCC SHOWFILESTATS
Run Code Online (Sandbox Code Playgroud)

它工作正常,我没有收到错误消息.

我的问题是脚本中有一种方法可以用变量@dbname括起方括号吗?

SQL*_*ace 8

是的,它被称为QuoteName

select quotename('bb bb')
Run Code Online (Sandbox Code Playgroud)