View
數據庫文件通過連結伺服器使用的空間
我需要通過連結伺服器(從一個中央伺服器到多個客戶端 SQL 伺服器)找出多個數據庫的數據庫文件使用的空間。我為所有數據庫創建了關於客戶端大小的視圖:
CREATE VIEW [dbo].[view] AS SELECT name AS 'DataFileName', physical_name AS 'DataPhysicalName', ROUND(size / 128, 1) AS 'DataTotalSizeInMB', ROUND(CAST(FILEPROPERTY(name, 'SpaceUsed') AS int) / 128.0, 1) AS 'DataSpaceUsedInMB', ROUND(size / 128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int) / 128.0, 1) AS 'DataAvailableSpaceInMB' FROM [sys].[database_files] WHERE type = 0
在伺服器端我使用循環來查詢這個視圖。但是“DataSpaceUsedInMB”列僅適用於我登錄的預設數據庫。
@cicik,如果您像您提到的那樣遍曆本地伺服器上的數據庫,假設您已經將遠端數據庫列表儲存在本地表中的某個位置,您可以遍歷數據庫(例如游標)並執行,
選擇 * 從
$$ YourLinkedServer $$.$$ YourRemoteDatabase $$.$$ dbo $$.$$ view $$; 這應該將遠端數據庫上下文放在您指定的數據庫中,因此它適用於僅返回目前數據庫值的FILEPROPERTY函式和sys.database_files dmv。
此外,您可能需要考慮提取遠端伺服器上的數據庫列表並在遠端伺服器(客戶端)的每次執行中執行腳本,這樣您就不必在每個數據庫上創建視圖,也不會錯過在您不知情的情況下創建的任何新數據庫。
UPDATE 如果您想使用腳本從連結伺服器中動態提取數據而不在每個數據庫上添加視圖,
DECLARE @remotecmd nvarchar(max); SET @remotecmd = N' DECLARE @db sysname, @cmd nvarchar(max); CREATE TABLE #dbspace ( DataFileName nvarchar(128), DataPhysicalName nvarchar(260), DataTotalSizeInMB decimal(17,6), DataSpaceUsedInMB decimal(17,6), DataAvailableSpaceInMB decimal(17,6) ); DECLARE dbcur CURSOR LOCAL FAST_FORWARD FOR SELECT name FROM sys.databases WHERE [state] = 0; OPEN dbcur; FETCH NEXT FROM dbcur INTO @db; WHILE @@FETCH_STATUS = 0 BEGIN SET @cmd = N''USE '' + QUOTENAME(@db) + N''; ''; SET @cmd = @cmd + N'' INSERT INTO #dbspace SELECT name AS [DataFileName], physical_name AS [DataPhysicalName], ROUND(size / 128.0, 1) AS [DataTotalSizeInMB], ROUND(CAST(FILEPROPERTY(name, ''''SpaceUsed'''') AS int) / 128.0, 1) AS [DataSpaceUsedInMB], ROUND(size / 128.0 - CAST(FILEPROPERTY(name, ''''SpaceUsed'''') AS int) / 128.0, 1) AS [DataAvailableSpaceInMB] FROM [sys].[database_files] WHERE type = 0''; EXEC (@cmd); FETCH NEXT FROM dbcur INTO @db; END CLOSE dbcur; DEALLOCATE dbcur; SELECT DataFileName, DataPhysicalName, DataTotalSizeInMB, DataSpaceUsedInMB, DataAvailableSpaceInMB FROM #dbspace; DROP TABLE #dbspace;' EXEC (@remotecmd) AT [YourLinkedServer];
確保您的登錄名可以訪問遠端伺服器上的所有數據庫。