2016-10-28 8 views
0

特定のサーバー上にあるデータベースのすべての名前を持つテーブルがあります。私は、DBSizeMB列を関連するDBサイズで更新できるようにしたい。SELECT変数を使用したUPDATE - TSQL

これまでのところ、私のコードは次のとおりです。

DECLARE @DatabaseName VARCHAR(100) 

UPDATE master.dbo.mytableName 
    SET DBsizeMB = (SELECT total_size_mb = CAST(SUM(size) * 8./1024 AS DECIMAL(8,2)) 
         FROM master.sys.master_files) 
    WHERE DBSizeMB = NULL 
      AND DatabaseName = @DatabaseName 

今SELECT合計サイズの一部は、データベースサイズのすべてを合計しています。

個々のデータベースを更新するにはどうすればよいですか?

+0

カスタムデータを 'master'に保存することはお勧めしません。 –

+1

あなたのコードは、まったく同じようには動作しません。 sys.master_filesは、すべてのデータベースのすべてのファイルです。そして、間違いなくマスターに独自のテーブルを作成しないでください。これは非常に悪い考えです。 –

+0

これは開発サーバー上にあり、シニアDBAのシステムdbに格納されることが承認されました – AznDevil92

答えて

2

Correlatesub-query

UPDATE mt 
SET DBsizeMB = (SELECT total_size_mb = Cast(Sum(size) * 8./1024 AS DECIMAL(8, 2)) 
        FROM master.sys.master_files f 
          JOIN sys.databases d 
          ON f.database_id = d.database_id 
        WHERE d.NAME = mt.DatabaseName) 
FROM master.dbo.mytableName mt 
WHERE DBSizeMB IS NULL 

JOINバージョン

WITH cte 
    AS (SELECT total_size_mb = Cast(Sum(size) * 8./1024 AS DECIMAL(8, 2)),d.name 
     FROM master.sys.master_files f 
       JOIN sys.databases d 
        ON f.database_id = d.database_id) 
UPDATE mt 
SET DBsizeMB = c.total_size_mb 
FROM master.dbo.mytableName mt 
     JOIN cte c 
     ON c.NAME = mt.DatabaseName 
WHERE DBSizeMB IS NULL 

また、コメントで述べたように、Masterデータベース内のテーブルを作成しないでください。 MSDNでさえ、

masterにユーザーオブジェクトを作成しないでください。

+1

'= NULL'ではなく 'WHERE DBSizeMB IS NULL'を変更する必要がありました – AznDevil92

関連する問題