2013-04-11 59 views
3

根据您的SQL Server数据库的许可和配置,您可能有不同的大小限制。例如:您可以根据SQL Server许可证查询最大数据库大小吗?

  • 的SQL Server 2012 Express有10GB的限制
  • 的SQL Server 2008 R2 Express有10GB
  • SQL Server 2008中的极限快递拥有4GB
  • 的限制

是有可能通过查询数据库服务器,找出最大容量是多少

我可以查询,找出当前大小:

name  DataFileSizeMB LogFileSizeMB 
--------- -------------- ------------- 
master   4.875000  1.750000 
tempdb   8.000000  0.500000 
model   4.062500  1.000000 
msdb   16.687500  4.562500 
Harrison  21.937500  18.187500 
Lennon  122.750000 425.625000 
McCartney  19.937500  49.687500 
Starr   19.937500  18.187500 

我现在我以后什么,是要找出最大的是什么样的基础上,许可没有可用的硬盘空间的方式。

+0

我试图包含此查询的SQL,但由于某种原因,stackoverflow被阻止。 –

回答

1

尝试这一个 -

SELECT 
     d.server_name 
    , d.sversion_name 
    , d.edition 
    , max_db_size_in_gb = 
     CASE WHEN engine_edition = 4 
      THEN 
       CASE 
        WHEN d.sversion_name LIKE '%2012%' THEN 10 
        WHEN d.sversion_name LIKE '%2008 R2%' THEN 10 
        WHEN d.sversion_name LIKE '%2008%' THEN 4 
        WHEN d.sversion_name LIKE '%2005%' THEN 4 
       END 
      ELSE -1 
     END 
FROM (
    SELECT 
      sversion_name = SUBSTRING(v.ver, 0, CHARINDEX('-', v.ver) - 1) 
     , engine_edition = SERVERPROPERTY('EngineEdition') 
     , edition = SERVERPROPERTY('Edition') 
     , server_name = SERVERPROPERTY('ServerName') 
    FROM (SELECT ver = @@VERSION) v 
) d 

此外,尝试此查询来获取有关数据库扩展信息 -

IF EXISTS(
    SELECT 1 
    FROM tempdb.dbo.sysobjects 
    WHERE id = OBJECT_ID('tempdb.dbo.#DBObj') 
) DROP TABLE #DBObj 

CREATE TABLE #DBObj 
(
     [DB] SYSNAME 
    , reservedpages INT 
    , usedpages INT 
    , pages INT 
) 

EXEC sys.sp_MSforeachdb ' 
    USE [?] 

    INSERT INTO #DBObj 
    (
      [DB] 
     , reservedpages 
     , usedpages 
     , pages 
    ) 
    SELECT 
      DB_NAME() 
     , pg.reservedpages 
     , pg.usedpages 
     , pg.pages 
    FROM (
     SELECT 
       reservedpages = SUM(a.total_pages) 
      , usedpages = SUM(a.used_pages) 
      , pages = SUM(
       CASE 
        WHEN it.internal_type IN (202, 204, 207, 211, 212, 213, 214, 215, 216, 221, 222) THEN 0 
        WHEN a.[type] != 1 AND p.index_id < 2 THEN a.used_pages 
        WHEN p.index_id < 2 THEN a.data_pages ELSE 0 
       END 
      ) 
     FROM sys.partitions p 
     JOIN sys.allocation_units a ON p.[partition_id] = a.container_id 
     LEFT JOIN sys.internal_tables it ON p.[object_id] = it.[object_id] 
    ) pg' 

SELECT 
     d.name 
    , total_size_mb = data.row_size_mb + data.log_size_mb 
    , data.log_size_mb 
    , data.row_size_mb 
    , reserved_space_mb = CAST(do.reservedpages * 8./1024 AS DECIMAL(10,2)) 
    , data_size_mb = CAST(do.pages * 8./1024 AS DECIMAL(10,2)) 
    , index_size_mb = CAST((do.usedpages - do.pages) * 8./1024 AS DECIMAL(10,2)) 
    , unused_size_mb = CAST((do.reservedpages - do.usedpages) * 8./1024 AS DECIMAL(10,2)) 
    , unallocated_space_mb = 
     CAST(CASE WHEN data.row_size >= do.reservedpages 
      THEN (data.row_size - do.reservedpages) * 8./1024 
      ELSE 0 
     END AS DECIMAL(10,2)) 
FROM (
    SELECT 
      df2.database_id 
     , log_size_mb = CAST(df2.log_size * 8./1024 AS DECIMAL(10,2)) 
     , row_size_mb = CAST(df2.row_size * 8./1024 AS DECIMAL(10,2)) 
     , df2.log_size 
     , df2.row_size 
    FROM (
     SELECT 
       df.database_id 
      , log_size = SUM(CASE WHEN df.type_desc = 'LOG' THEN df.size END) 
      , row_size = SUM(CASE WHEN df.type_desc = 'ROWS' THEN df.size END) 
     FROM sys.master_files df 
     GROUP BY df.database_id 
    ) df2 
) data 
JOIN sys.databases d ON data.database_id = d.database_id 
JOIN #DBObj do ON do.DB = d.name 
ORDER BY data.row_size_mb + data.log_size_mb DESC 
+0

谢谢你,我正在考虑自己前往这个方向,你已经救了我几个小时。 –

0

我不确定如何在“给我数据库的最大大小”级别上做到这一点,但您可以查询sys.database_files并将它从组成数据库的文件中拼凑起来。

我认为相关的列将是max_size,这是8KB页面中的最大文件大小。

PS。sys.database_files是每个数据库视图,如果你想查看它在您的整个SQL Server实例,然后sys.master_files可能会更好....

+0

我确实看过,但是对于我正在查看的数据库,值是'-1',这意味着'文件将增长到磁盘已满'。 –

+0

那么当没有设置最大尺寸时,你称之为最大尺寸? –

+0

我现在所追求的是一种基于*授权*而不是可用硬盘空间来了解最大值的方法。 –

-1

报告的所有尺寸都在MB

注意 - 有更好的方法来检查文件是否是日志或数据文件;在这里检查“.ldf”后缀对于99%的安装是有效的。

if object_id('tempdb..#sizes') is not null 
drop table #sizes; 
GO 
create table #sizes (dbname sysname, cursize int, maxsize int, isunlimited int, curlogsize int, maxlogsize int, islogunlimited int); 

exec sp_msforeachdb ' 
insert #sizes 
select ''?'', 
    sum(case when filename like ''%.ldf'' then 0 else size end), 
    sum(case when filename like ''%.ldf'' then 0 else maxsize end), 
    min(case when filename like ''%.ldf'' then 0 else maxsize end), 
    sum(case when filename like ''%.ldf'' then size else 0 end), 
    sum(case when filename like ''%.ldf'' then maxsize else 0 end), 
    min(case when filename like ''%.ldf'' then maxsize else 0 end) 
from [?].sys.sysfiles'; 

select dbname, cursize/128.0, 
    case when isunlimited = -1 then 'unlimited' else str(maxsize/128.0) end, curlogsize/128.0, 
    case when islogunlimited = -1 then 'unlimited' else str(maxlogsize/128.0) end 
from #sizes 
order by dbname; 
+0

感谢Richard,我知道'maxsize'字段,但这不是我想要找到的限制。我所追求的是许可证对数据库大小的限制。 –

+1

然后只需使用'select @@ version'。如果它包含“EXPRESS”,则存在大小限制,否则不存在。如果它包含2005年,那么它是4GB,否则10GB。 – RichardTheKiwi

2

我临客Devart的拟设,但怎么样的东西更紧凑一点:

SELECT max_db_size_in_gb = 
    CASE WHEN serverproperty('EngineEdition') = 4 THEN 
     CASE WHEN SERVERPROPERTY('productversion') between '10.50' and '5' THEN 10 ELSE 4 END 
    ELSE -1 
    END 

(取而代之解析@@ VERSION的输出,检查SERVERPROPERTY('productversion')肯定更容易?此外,当新版本如SQL Server 2014发布时,这更安全。)

(编辑:旧版本只是检查“< '10 .50'”,这当然是错误的,因为例如'9.00'(SQL Server 2005 )按字典顺序更大!)

相关问题