我尝试创建一个表来存储每个数据库的已用存储信息。
由于这些托管在不同的集群/实例上,我创建了一个包含所有实例/服务器信息的表。
_______________________
|________DBInstance_______|
|____ID___|_实例_______|
|____1____|服务器\实例__|
|____2____|AG-Listener_____|
然后我创建一个游标并将我的查询发送到实例表中列出的每个服务器。
DECLARE @ID nvarchar(2), @Instancename VARCHAR(50), @cmd NVARCHAR(MAX)
DECLARE DBCursor CURSOR FOR
SELECT ID, Instance
from DBInstancelist;
DECLARE @ID nvarchar(2), @Instancename VARCHAR(50), @cmd NVARCHAR(MAX)
DECLARE DBCursor CURSOR FOR
SELECT ID, Instance
from DBInstancelist;
OPEN DBCursor
FETCH NEXT FROM DBCursor into @id , @Instancename
WHILE @@FETCH_STATUS = 0
BEGIN
select @cmd = N'INSERT INTO DBSIZE
select a.*
from OPENROWSET (''SQLNCLI'',''Server=' + @Instancename + ';Trusted_Connection=YES;'',''select
[ID] = '+@ID+',
[Database Name] = DB_NAME(database_id),
[Type] = CASE WHEN Type_Desc = ''''ROWS'''' THEN ''''Data File''''
WHEN Type_Desc = ''''LOG'''' THEN ''''Log File''''
ELSE ''''SUMME'''' END,
[Size in MB] = CAST( ((SUM(Size)* 8) / 1024.0) AS DECIMAL ),
GETDATE() AS Scantime
FROM sys.master_files
WHERE database_id > 4
GROUP BY GROUPING SETS
(
(DB_NAME(database_id), Type_Desc),
(DB_NAME(database_id))
)
ORDER BY DB_NAME(database_id), Type_Desc DESC'')
AS a;'
--select @cmd
exec sp_executesql @cmd
--select @cmd
FETCH NEXT FROM DBCursor into @ID, @Instancename
END
CLOSE DBCursor
DEALLOCATE DBCursor
对于前 4 个实例,我收到了信息,但对于第 5 个实例,我收到了以下错误。
"Arithmetic overflow error converting expression to data type int.
这个错误只会出现,如果我添加行
"[ID] = '+@ID+',",
但进一步报告需要实例 ID。
为什么会出现转换,我该如何阻止它(我的错误在哪里)?
抱歉,不知道如何突出显示评论。
Scott Hodgin postet 解决方案:
是正确的行,也是我的问题的解决方案:)
非常感谢:)!