-- 多数据文件(推荐方案,推荐每文件4GB/8GB/16GB每个固定大小)

  1. -- 清空数据文件 
  2. -- 收缩和清空文件都是可以中途停止,且会保留当前处理进度,下次继续到时候不会重新开始 
  3. DBCC SHRINKFILE (DF_DEMO_2011_04, EMPTYFILE); 
  4.  
  5. -- 删除清空后的数据文件 
  6. USE master; 
  7. GO 
  8. ALTER DATABASE AdventureWorks2008R2 
  9. REMOVE FILE LogicFileName; 
  10. GO 
  11.  
  12.  
  13. -- 查看对应要收缩的文件组文件使用率 
  14. -- 加入逻辑文件名后也可以查看单个文件数据使用率 
  15. SELECT  
  16.     T.NAME  
  17.     , T.FILENAME 
  18.     , FILEPROPERTY(T.NAME,'SPACEUSED') * 8.0 /1024 / 1024 AS [USED_GB] 
  19.     , T.SIZE * 8.0 /1024 / 1024 AS [TOTIL_GB] 
  20.     , 'DBCC SHRINKFILE (' + T.NAME + ', EMPTYFILE); 
  21.         GO 
  22.         ALTER DATABASE NOASODS_HW REMOVE FILE ' + T.NAME + '
  23.         GO' AS  [SQL] 
  24. FROM 
  25.     SYS.SYSFILES T 
  26. WHERE  
  27.     FILEGROUP_NAME(T.GROUPID) = 'FileGroupName' 
  28.     -- AND T.NAME = 'LogicFileName' 
  29. ORDER BY T.NAME DESC 

-- 一个大数据文件(真心的表示抵制,这就是一个噩梦的开始... ...)

  1. -- 收缩数据文件 
  2. DBCC SHRINKFILE (LogicFileName, DatabaseId); 
  3.  
  4. -- 大数据文件收缩 
  5. DECLARE @BeginSize  BIGINT              --原始大小MB 
  6. DECLARE @EndSize    BIGINT              --最终大小MB 
  7. DECLARE @ShrinkSize BIGINT              --需要收缩的大小MB 
  8. DECLARE @UnitSize   INT                 --每次收缩的大小MB 
  9. DECLARE @Loop       INT                 --循环次数 
  10. DECLARE @FileName   VARCHAR(256)        --收缩的文件逻辑名称 
  11.  
  12. SET @UnitSize = 512 
  13. SET @BeginSize = 239493 
  14. SET @EndSize = 164413 
  15. SET @ShrinkSize = @BeginSize - @EndSize 
  16. SET @FileName = N'HW_DB_Dat1' 
  17. SET @Loop = 1 
  18.  
  19. WHILE   @ShrinkSize > @Loop * @UnitSize 
  20. BEGIN 
  21.      
  22.     SET @EndSize = @BeginSize - @Loop * @UnitSize 
  23.     PRINT 'DBCC SHRINKFILE (' + CAST(@FileName AS VARCHAR) + ',' + CAST(@EndSize AS VARCHAR) + ') BEGING DATETIME:' + CAST(GETDATE() AS VARCHAR
  24.     DBCC SHRINKFILE (@FileName, @EndSize) 
  25.     PRINT 'DBCC SHRINKFILE (' + CAST(@FileName AS VARCHAR) + ',' + CAST(@EndSize AS VARCHAR) + ') END DATETIME:' +CAST(GETDATE() AS VARCHAR
  26.     SET @Loop = @Loop + 1 
  27.  
  28. END