Sql-Server

您可以將 DBCC Shrinkfile 嵌入到 IF 語句中嗎?

  • December 2, 2021

我有一個問題,我的維護作業事務日誌在執行時並不總是縮小DBCC SHRINKFILE 。我的想法是放在DBCC SHRINKFILE一個 if 語句中,該語句檢查日誌文件的大小,如果它是 > 我輸入的值以繼續執行直到它低於該值。

我發現我可以從中提取數據, select size from sys.database_files where name = 'DB_log' 但是當我嘗試放置時,DBCC SHRINKFILE我無法讓牠喜歡任何語法?這只是數據庫控制台命令的限制嗎?

select size 
   , case when size > 10210 then (DBCC SHRINKFILE (N'db_log' , TRUNCATEONLY) else end
   from sys.database_files

非常感謝 SQL 新手!

這就是你需要的。

SELECT 
size, 
shrinkStatement=
CASE 
 WHEN size > 10210 THEN '(DBCC SHRINKFILE (N''db_log'' , TRUNCATEONLY)' 
 ELSE 'do not shrink'
END
FROM sys.database_files
WHERE type_desc ='Log'

在部署它之前,我建議您閱讀 Brent Ozar 的這篇文章以及其中引用的所有其他文章。 停止收縮您的數據庫文件。嚴重地。現在。

您希望隨時間收集您的日誌文件使用情況並將其保持在您的平均使用大小,而不是在每次增長時縮小它。

首先:不要縮小你的數據庫文件!你已經被指向了Brent 的文章,我有我自己的文章,如果你用Google搜尋,你會發現關於這個主題的文章源源不斷。

話雖如此,如果你真的堅持這樣做:

你的提議似乎很奇怪。您在 SELECT 中使用 CASE。在那裡你嘗試建構一個 SQL 命令。這本身不會執行任何操作。也許您想生成一個 SQL 命令並使用動態 SQL 來獲取該 SQL 命令和 EXEC(@sql)?如果是這樣,你已經得到了一個指針。

否則,您應該在變數中構造收縮命令,並根據某些條件使用 IF 語句(不是 CASE 表達式)有條件地執行變數中的收縮命令。也許你想要一個圍繞這個的 WHILE 循環繼續執行,直到你達到你的目標大小。如果你想追求這個,只是一個粗略的指針。

但是,如果您的系統需要 100GB 的日誌空間來執行操作,那麼只需將其視為系統成本,而不是不斷縮小文件並讓它一遍又一遍地增長。

引用自:https://dba.stackexchange.com/questions/303390