2009-04-22 3 views
1

Ich habe ein Skript aus dem Netz, das die Verwendung von Datendateien und Transaktionsprotokolldateien von einer bestimmten SQL Server-Instanz berechnet. Das Skript funktioniert einwandfrei, wenn es keinen Datenbanknamen mit Leerzeichen gibt oder nicht zu lang ist. Wenn der Name der Datenbank jedoch Leerzeichen enthält oder zu lang ist, wird die Fehlermeldung "Msg 911, Ebene 16, Status 1, Zeile 1 Eintrag in Sysdatabases für Datenbank 'Test' nicht gefunden. Kein Eintrag mit diesem Namen gefunden. Stellen Sie sicher, dass der Name korrekt eingegeben wurde. " In der Beispielfehlermeldung hat der "Test" den vollständigen Datenbanknamen "Test DB", der ein Leerzeichen enthält. Bitte beachten Sie den Code unten:Wie werden eckige Klammern an eine Variable angehängt, die als Wert einer Variablen in T-SQL gesetzt wurde?

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

In meiner Analyse wird die Fehlermeldung beginnt zu erscheinen, wenn die Zeile " 'Verwendung' @string = set + @dbname + 'DBCC SHOWFILESTATS'" erreicht ist. Ich habe versucht, den Befehl auszuführen

use Test DB 
DBCC SHOWFILESTATS 

und ich habe die gleiche Fehlermeldung, die ich oben erwähnt. Aber wenn ich den Befehl mache

use [Test DB] 
DBCC SHOWFILESTATS 

es funktioniert gut und ich bekomme die Fehlermeldung nicht.

Meine Frage ist, gibt es eine Möglichkeit im Skript, die Variable @dbname mit eckigen Klammern zu umschließen?

Antwort

2

Da Sie die Zeichenfolge bauen also warum nicht sagen

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

Danke für die Lösung. Die Lösung funktioniert für den Datenbanknamen mit Leerzeichen. Die Lösung funktioniert jedoch nicht für einen Datenbanknamen, der zu lang ist wie "SharePoint_AdminContent_6f5089ae-ee38-48b6-af98-1c" – titanium

0

In Bezug auf langen DB-Namen. Offenbar müssen Sie @ dbname varchar (100) anstelle von varchar (50) und @string varchar (300) anstelle von @string varchar (250) deklarieren. Und Sie benötigen ähnliche Änderungen in den Tabellendefinitionen (Spalten DB-Name).

Verwandte Themen