2009-04-22 114 views
1

我從網上獲得了一個腳本,用於計算某個SQL Server實例中的數據文件和事務日誌文件的使用情況。如果沒有帶空格的數據庫名稱或者不太長,該腳本可以正常工作。但是,如果數據庫名稱有空白或太長,我會收到錯誤消息「Msg 911,Level 16,State 1,Line 1 無法找到sysdatabases中數據庫'Test'的條目,找不到具有該名稱的條目。確保名稱輸入正確。「在示例錯誤消息中,'Test'具有完整的數據庫名稱「Test DB」,其中包含空格。請參閱下面的代碼:如何將方括號包含在T-SQL中設置爲一個變量值的變量中?

--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 

在我的分析,錯誤消息開始出現,當行「設置@string =‘使用’+ @dbname +‘DBCC SHOWFILESTATS’」爲止。我曾嘗試執行命令

use Test DB 
DBCC SHOWFILESTATS 

我收到了上面提到的同樣的錯誤信息。但如果我做的命令

use [Test DB] 
DBCC SHOWFILESTATS 

它工作正常,我沒有得到錯誤消息。

我的問題是腳本中是否有方法將變量@dbname括在方括號內?

回答

2

既然你正在構建的字符串,那麼爲什麼不說

set @string = 'use [' + @dbname + '] DBCC SHOWFILESTATS' 
+0

感謝您的解決方案。該解決方案適用於帶有空格的數據庫名稱。但是,該解決方案不適用於數據庫名稱太長,如「SharePoint_AdminContent_6f5089ae-ee38-48b6-af98-1c」 – titanium 2009-04-22 22:22:16

0

關於長DB名。看起來你必須聲明@string varchar(250)的varchar(50)和@string varchar(300)insted的@dbname varchar(100)。 而且您需要在表定義(列dbname)中進行類似的更改。