使用SELECT变量-TSQL更新

使用SELECT变量-TSQL更新,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表,其中包含特定服务器上数据库的所有名称。我希望能够使用相关的数据库大小更新DBSizeMB列 到目前为止,我的代码是: DECLARE @DatabaseName VARCHAR(100) UPDATE master.dbo.mytableName SET DBsizeMB = (SELECT total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(8,2)) FROM maste

我有一个表,其中包含特定服务器上数据库的所有名称。我希望能够使用相关的数据库大小更新DBSizeMB列

到目前为止,我的代码是:

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
现在,“选择总大小”部分将汇总所有数据库的大小


如何将其设置为更新每个数据库?

Correlate
子查询

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 
加入
版本

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
数据库中创建表。甚至在书中也提到

不要在master中创建用户对象


关联
子查询

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 
加入
版本

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
数据库中创建表。甚至在书中也提到

不要在master中创建用户对象


不建议将自定义数据存储在
master
中。您的代码根本不会这样工作。sys.master_files是每个数据库的所有文件。绝对不要在master中创建自己的表。这是一个非常糟糕的主意。好吧,但它是在开发服务器上的,高级DBA批准它存储在系统数据库中。为这样的东西创建
实用程序
数据库并不难,对于以后的开始,迁移
master
到其他地方是不(真的)可能的。据我所知,在master中应该包含的唯一内容是存储过程。即使如此,我们谈论的是像sp_Who2和sp_Blitz这样的全局实用程序,而不是应用程序使用的实用程序。不建议将自定义数据存储在
master
中。您的代码根本不会像这样工作。sys.master_files是每个数据库的所有文件。绝对不要在master中创建自己的表。这是一个非常糟糕的主意。好吧,但它是在开发服务器上的,高级DBA批准它存储在系统数据库中。为这样的东西创建
实用程序
数据库并不难,对于以后的开始,迁移
master
到其他地方是不(真的)可能的。据我所知,在master中应该包含的唯一内容是存储过程。即使如此,我们谈论的是全局实用程序,如sp_Who2和sp_Blitz,而不是应用程序使用的实用程序。我需要更改“WHERE DBSizeMB IS NULL”而不是“=NULL”。我需要更改“WHERE DBSizeMB IS NULL”而不是“=NULL”