数据库专家答疑目录

  |  手机版

收藏网站

投稿QQ:1745232315

IT专家网,汇聚专业声音 解析IT潮流 IT专家网,汇聚专业声音 解析IT潮流

网络

专家视点在现场环球瞭望
IT专家网 > 数据库子站 > 数据库专家答疑目录

用T-SQL Code确定SQL Server中的可用磁盘空间

作者:唐小若出处:IT专家网2009-03-26 10:22

  如果磁盘空间很紧张或者大比例的磁盘需要用来进行该进程,那么在继续进行一个进程之前检查磁盘空间是一个明智之举。如果在一个进程运行数小时之后由于磁盘不足而导致进程在快结束时失败,那么这是令人不安的。虽然SQL Server中有几个不同的选项可用来检查磁盘(CLR,,WMI, PowerShell等等),但是 让我们来看看怎样使用SQL Server 2000 到 2008都提供的xp_fixeddrives扩展存储过程解决这个问题。

  用来评估一个SQL Server 磁盘驱动器上可用磁盘空间的示例存储过程

  在下面的示例存储过程中,它接受了一个特定磁盘驱动器上最低量的可用MB的参数,然后执行master.sys.xp_fixeddrives扩展存储过程到一个临时表中。一旦该数据在临时表中,当前的可用磁盘空间就会与最小的可用磁盘空间进行比较,从而确定该进程应该继续还是产生一个错误。

  要记住的一点是在SQL Server 2000和SQL Server 2005/2008之间,xp_fixeddrives扩展存储过程的属主发生了变化。在SQL Server 2000中,xp_fixeddrives的属主是dbo,而在SQL Server 2005/2008中,属主变成了sys。由于属主的变化,两个存储过程分别提供如下。一个针对SQL Server 2005/2008,另一个针对SQL Server 2000。

  

      *** NOTE *** - SQL Server 2008 and 2005 Version

  CREATE PROCEDURE dbo.spExec_SufficientDiskSpace @MinMBFree int, @Drive char(1) AS

  /*

  ----------------------------------------------------------------------------

  -- Object Name: dbo.spExec_SufficientDiskSpace

  -- Project: Admin Scripts

  -- Business Process: Monthly Sales Reports

  -- Purpose: Validate sufficient disk space

  -- Detailed Description: Validate sufficient disk space based on based on the

  -- @MBfree and @Drive parameters

  -- Database: Admin

  -- Dependent Objects: master.sys.xp_fixeddrives

  -- Called By: Admin Scripts

  -- Upstream Systems: Unknown

  -- Downstream Systems: Unknown

  --

  --------------------------------------------------------------------------------------

  -- Rev | CMR | Date Modified | Developer | Change Summary

  --------------------------------------------------------------------------------------

  -- 001 | N\A | 03.05.2009 | MSSQLTips | Original code

  --

  */

  SET NOCOUNT ON

  -- 1 - Declare variables

  DECLARE @MBfree int

  DECLARE @CMD1 varchar(1000)

  -- 2 - Initialize variables

  SET @MBfree = 0

  SET @CMD1 = ''

  -- 3 - Create temp tables

  CREATE TABLE #tbl_xp_fixeddrives

  (Drive varchar(2) NOT NULL,

  [MB free] int NOT NULL)

  -- 4 - Populate #tbl_xp_fixeddrives

  INSERT INTO #tbl_xp_fixeddrives(Drive, [MB free])

  EXEC master.sys.xp_fixeddrives

  -- 5 - Initialize the @MBfree value

  SELECT @MBfree = [MB free]

  FROM #tbl_xp_fixeddrives

  WHERE Drive = @Drive

  -- 6 - Determine if sufficient fre space is available

  IF @MBfree > @MinMBFree

  BEGIN

  RETURN

  END

  ELSE

  BEGIN

  RAISERROR ('*** ERROR *** - Insufficient disk space.', 16, 1)

  END

  -- 7 - DROP TABLE #tbl_xp_fixeddrives

  DROP TABLE #tbl_xp_fixeddrives

  SET NOCOUNT OFF

  GO

  *** NOTE *** - SQL Server 2000 Version

  CREATE PROCEDURE dbo.spExec_SufficientDiskSpace @MinMBFree int, @Drive char(1) AS

  /*

  ----------------------------------------------------------------------------

  -- Object Name: dbo.spExec_SufficientDiskSpace

  -- Project: Admin Scripts

  -- Business Process: Monthly Sales Reports

  -- Purpose: Validate sufficient disk space

  -- Detailed Description: Validate sufficient disk space based on based on the

  -- @MBfree and @Drive parameters

  -- Database: Admin

  -- Dependent Objects: master.sys.xp_fixeddrives

  -- Called By: Admin Scripts

  -- Upstream Systems: Unknown

  -- Downstream Systems: Unknown

  --

  --------------------------------------------------------------------------------------

  -- Rev | CMR | Date Modified | Developer | Change Summary

  --------------------------------------------------------------------------------------

  -- 001 | N\A | 03.05.2009 | MSSQLTips | Original code

  --

  */

  SET NOCOUNT ON

  -- 1 - Declare variables

  DECLARE @MBfree int

  DECLARE @CMD1 varchar(1000)

  -- 2 - Initialize variables

  SET @MBfree = 0

  SET @CMD1 = ''

  -- 3 - Create temp tables

  CREATE TABLE #tbl_xp_fixeddrives

  (Drive varchar(2) NOT NULL,

  [MB free] int NOT NULL)

  -- 4 - Populate #tbl_xp_fixeddrives

  INSERT INTO #tbl_xp_fixeddrives(Drive, [MB free])

  EXEC master.dbo.xp_fixeddrives

  -- 5 - Initialize the @MBfree value

  SELECT @MBfree = [MB free]

  FROM #tbl_xp_fixeddrives

  WHERE Drive = @Drive

  -- 6 - Determine if sufficient fre space is available

  IF @MBfree > @MinMBFree

  BEGIN

  RETURN

  END

  ELSE

  BEGIN

  RAISERROR ('*** ERROR *** - Insufficient disk space.', 16, 1)

  END

  -- 7 - DROP TABLE #tbl_xp_fixeddrives

  DROP TABLE #tbl_xp_fixeddrives

  SET NOCOUNT OFF

  GO

  下一步

  如果你的组织拥有的程序要求一个很大量的磁盘空间或者大比例的特定磁盘,那么确保在程序开始或者关键点时确认磁盘驱动器具有足够的存储。一次快速检查就可以节约大量的时间,减少烦恼和重新工作。

  使用上面列出的存储过程中的master.sys.xp_fixeddrives扩展存储过程是检查可用磁盘空间的其中一种方法。CLR,PowerShell,WMI等等也可以检查磁盘空间,所以选择适合你代码和环境的方法。

相关文章

关键词: 评论

责任编辑:包春林

专题推荐

原创文章

微博互动

白皮书

网警备案