2016-10-28 5 views
0

У меня есть таблица со всеми именами баз данных, которые находятся на определенном сервере. Я хочу иметь возможность обновлять столбец DBSizeMB с соответствующим размером БД.UPDATE с SELECT Variable - 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 

Щас ВЫБРАТЬ общий размер части подытоживает все размеры в базах данных.

Как я могу настроить его для обновления каждой отдельной базы данных?

+0

Не рекомендуется хранить пользовательские данные в 'master'. –

+1

Ваш код не будет работать совсем так. sys.master_files - ВСЕ файлы для каждой базы данных. И определенно НЕ создавайте свои собственные таблицы в главном. Это очень плохая идея. –

+0

Хорошо, но он находится на сервере разработки, и он был одобрен старшими администраторами баз данных, которые будут храниться в системе. 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 упоминается, что

Не создавайте пользовательские объекты в главном.

+1

Мне нужно было изменить 'WHERE DBSizeMB IS NULL' вместо '= NULL' – AznDevil92