The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

DBCC CHECKTABLE 無法檢查表格名稱中有小數點的情況

在我們代管眾多客戶的 SQL Server 資料庫中其中有個客戶的資料庫非常特殊,他們的資料表命名都會有小數點在內,例如:[dbo].[Order.Profile],至於為什麼這樣命名已經不可考 (我猜是為了讓表格在 Management Studio 裡排序的比較整齊吧?!),這樣的設計在開發上的確沒有什麼問題,只要適切的加上中括弧 ( [xxxx] ) 即可,但是在管理面來說,就不是那樣可愛了,像我昨天為了要執行 DBCC CHECKTABLE 來檢查資料表時就試了好久無法成功,直到詢問微軟技術支援中心才得到解答。

我嘗試使用以下語法執行,失敗! ( 備註:使用以下語對於沒有小數點的表格名稱是可以正常執行的)

DBCC CHECKTABLE ([Order.Profile], REPAIR_REBUILD);

  

嘗試使用以下語法執行,失敗!

DBCC CHECKTABLE (dbo.[Order.Profile], REPAIR_REBUILD);

  

試到明明知道會失敗還在試,失敗中的失敗!  
( :人在身處絕境的時候總是不理性的,寫程式除錯到不知道問題在哪裡也是會這樣的 XDDD )

DBCC CHECKTABLE (Order.Profile, REPAIR_REBUILD);

  

上述第一種方法是我參考以前曾經記錄的筆記而來的,感覺沒什麼不對,但卻無法正常執行讓我很懊惱,最後解決的辦法竟然是加上雙引號就解決了,一整個蠢很大~ Orz … 正確的語法如下:

DBCC CHECKTABLE ("dbo.[Order.Profile]", REPAIR_REBUILD);

如此微小的細節,要是我有認真看完 TechNet 的線上文件就好了:DBCC CHECKTABLE (T-SQL) ,因為線上文件的範例都是有加上雙引號的!

以下是執行 DBCC CHECKTABLE 的完整語法供參考:

USE master
GO

-- 將資料庫設為 SINGLE_USER 模式
ALTER DATABASE [DBNAME]  
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;  
GO 

-- 執行 DBCC CHECKTABLE 搭配使用 REPAIR_REBUILD 參數
USE [DBNAME] 
GO
DBCC CHECKTABLE ("dbo.[Order.Profile]", REPAIR_REBUILD);
GO


-- 將資料庫切為 MULTI_USER 模式
ALTER DATABASE [DBNAME]  
SET MULTI_USER;  
GO

心得分享

這個故事告訴我們,不要太過相信自己過往的經驗,有時後之前可以成功執行只是因為運氣好,沒釐清真相前這輩子總有再遇到相同問題的一天,所以這問題再蠢我也要寫出來提醒自己一下。 ^__^

相關連結