2009-04-22 7 views
1

J'ai reçu un script du Net qui calcule l'utilisation des fichiers de données et des fichiers journaux des transactions à partir d'une certaine instance de SQL Server. Le script fonctionne correctement s'il n'y a pas de nom de base de données avec des espaces ou n'est pas trop long. Toutefois, si le nom de la base de données a des espaces ou est trop long, le message d'erreur "Msg 911, Niveau 16, Etat 1, Ligne 1 Impossible de localiser l'entrée dans sysdatabases pour la base de données 'Test' Aucune entrée trouvée avec ce nom. Assurez-vous que le nom est entré correctement. " Dans l'exemple de message d'erreur, le 'Test' a le nom complet de la base de données "Test DB" qui a un espace. S'il vous plaît voir le code ci-dessous:Comment insérer des crochets dans une variable qui a été définie comme une valeur d'une variable dans 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 

Dans mon analyse, le message d'erreur commence à apparaître lorsque la ligne "set @string = 'utilisation' + @dbname + 'DBCC SHOWFILESTATS'" est atteint. J'ai essayé d'exécuter le commmand

use Test DB 
DBCC SHOWFILESTATS 

et j'ai reçu le même message d'erreur que j'ai mentionné ci-dessus. Mais si je fais la commande

use [Test DB] 
DBCC SHOWFILESTATS 

cela fonctionne très bien et je ne reçois pas le message d'erreur.

Ma question est de savoir s'il existe un moyen dans le script d'inclure la variable @dbname entre crochets?

Répondre

2

Puisque vous construisez la chaîne alors pourquoi ne pas dire

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

Merci pour la solution. La solution fonctionne correctement pour le nom de la base de données avec des espaces. La solution ne fonctionne cependant pas pour le nom de base de données trop long comme "SharePoint_AdminContent_6f5089ae-ee38-48b6-af98-1c" – titanium

0

En ce qui concerne les noms longs DB. Il semble que vous devez déclarer @dbname varchar (100) insted de varchar (50) et @string varchar (300) insted de @string varchar (250). Et vous avez besoin de changements similaires dans les définitions de table (colonnes nombd).

Questions connexes