1

我尝试使用 SSMS 对多个已注册的 SQL Server 运行此查询:

SELECT DISTINCT(volume_mount_point), 
    total_bytes / 1048576 AS Size_in_MB, 
    available_bytes / 1048576 AS Free_in_MB,
    (SELECT ROUND(CAST(available_bytes / 1048576 * 1.0 as FLOAT) / CAST(total_bytes / 1048576 * 1.0 AS FLOAT) * 100, 2)) AS FreePercentage
FROM 
    sys.master_files AS f 
CROSS APPLY 
    sys.dm_os_volume_stats(f.database_id, f.file_id)
GROUP BY
    volume_mount_point, total_bytes / 1048576, available_bytes / 1048576  
ORDER BY 
    4

一些服务器具有不知道“sys.dm_os_volume_stats”和整个查询崩溃报告的 SQL Server 2008 R2 RTM 产品级别:

消息 208,级别 16,状态 1,第 1 行
无效的对象名称“sys.dm_os_volume_stats”。

我试图在主 SELECT 之前添加一个条件,但它不起作用:

  DECLARE @ProductLevel varchar(128)  
  SET @ProductLevel = CONVERT(VARCHAR(128), SERVERPROPERTY ('ProductLevel'))
  IF @ProductLevel not like 'RTM'
    BEGIN...

我还尝试通过此文档分隔结果 来更改多服务器结果选项

更改多服务器结果选项 在 Management Studio 的“工具”菜单上,单击“选项”。

展开查询结果,展开 SQL Server,然后单击多服务器结果。

在“多服务器结果”页面上,指定所需的选项设置,然后单击“确定”。

还有其他想法吗?

4

1 回答 1

1

如果IFDMV 不存在,则不会评估条件,因为整个批处理在编译时失败,因此IF永远不会执行该语句。

一种解决方法是将查询包装在条件动态 SQL 中:

IF CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS varchar(20)),4) AS int) > 10 OR 
    (CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS varchar(20)),4) AS int) = 10
     AND CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS varchar(20)),3) AS int) = 5
     AND SERVERPROPERTY('ProductLevel') <> 'RTM')
BEGIN
EXEC sp_executesql N'
SELECT DISTINCT(volume_mount_point), 
    total_bytes / 1048576 AS Size_in_MB, 
    available_bytes / 1048576 AS Free_in_MB,
    (SELECT ROUND(CAST(available_bytes / 1048576 * 1.0 as FLOAT) / CAST(total_bytes / 1048576 * 1.0 AS FLOAT) * 100, 2)) AS FreePercentage
FROM 
    sys.master_files AS f 
CROSS APPLY 
    sys.dm_os_volume_stats(f.database_id, f.file_id)
GROUP BY
    volume_mount_point, total_bytes / 1048576, available_bytes / 1048576  
ORDER BY 
    4;
'
END;
于 2019-05-12T21:21:44.937 回答