我想要一个可以执行的存储过程,它提供了数据库可以占用的最大可能空间百分比。例如,SQL Server 2005/2008
具有4GB数据库限制,而2008R2具有10GB限制(快速版本)。
我知道我可以EXEC sp-spaceused
获取当前的数据库大小和未分配的空间,但是未分配的空间似乎是一些任意的块大小,并且随着数据库的增长将分配一个新的块。
我可以调用一个程序来获取数据库的最大大小限制吗?理想情况下,我想要的是当前分配的数量与最大数量的百分比,因此如果数据库当前为2GB,并且我在SQL 2008 R2(最大10GB)上,则过程将返回20.0,或0.2表示20%。由于数据库可以安装在任意数量的SQL Server上,因此我不想假设SQL服务器版本,并且希望在运行时获得最大值。
答案 0 :(得分:0)
您可以使用SELECT @@version
并解析该字符串中的版本和版本。您必须将其与具有特定SQL版本/版本允许的最大存储空间的手动填充数据集进行比较。
这样的东西应该从版本字符串中获取该信息
DECLARE @VersionString VARCHAR(500)
DECLARE @Product VARCHAR(50)
DECLARE @Edition VARCHAR(50)
SELECT @VersionString = @@VERSION
SET @Product = SUBSTRING(@VersionString, 0, PATINDEX('%-%', @VersionString))
SET @Edition = SUBSTRING(@VersionString, PATINDEX('%Corp%', @VersionString) + 13 , 18)
SELECT @Product
SELECT @Edition
答案 1 :(得分:0)
如果我没弄错,在非Express版本中,数据库大小没有特别的限制。因此,数据库的大小仅受HDD容量的限制。所以,试试这个 -
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