在我們代管眾多客戶的 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
心得分享
這個故事告訴我們,不要太過相信自己過往的經驗,有時後之前可以成功執行只是因為運氣好,沒釐清真相前這輩子總有再遇到相同問題的一天,所以這問題再蠢我也要寫出來提醒自己一下。 ^__^
相關連結