Skip to content

指令碼宣告的物件 ​

暫存資料表、資料表變數與 CTE 在提示、預覽與 F12 的處理。表面本身見 物件結構提示。

先問指令碼再問快照 ​

暫存資料表、資料表變數與 CTE 在中繼資料裡一列都查不到,所以定位 (Metadata/Model/SqlObjectLookup)先問指令碼再問快照。只問快照的症狀是 使用者上一行才寫下的名稱,停上去什麼都沒有,Ctrl+F12 還回報「不是可辨識的 資料庫物件」。欄位就寫在眼前的宣告括號裡,名冊(Metadata/Model/SqlScriptDeclarations) 與指令碼宣告的資料表建議共用同一次掃描,三條入口問的 也是它。這一支不必等連線,沒連上資料庫時照樣答得出來。

它們沒有 object_id(一律是 0),明細因此跟著定位一起交出去,不回頭問中繼資料 ——第二、三層快取正是照編號存的,問過去不是白跑一次查詢,就是拿到另一個同樣 沒有編號的東西。同一個理由,SqlObjectKinds.IsScriptDeclared 的三種在中繼資料 服務那裡沒有目錄可換。

指令碼分頁交出的是宣告原文而不是由資料行重組的一份:文字讀得出「有沒有 DEFAULT」,卻讀不出它寫的是什麼,重組出來的那一段貼回編輯器執行不了。資料表變數 補上 DECLARE(RETURNS @rows TABLE (…) 的原文不是從它開始的),CTE 補上 WITH ——但 CTE 的宣告不是一句可以單獨執行的敘述,因此不算可執行指令碼。CTE 的欄位 只有名稱,理由見欄位。

F12 對這三種只回報一句「定義就在目前的查詢視窗裡」:開一個新視窗把它複製一份, 等於請使用者去看他已經在看的東西。

建議清單那條入口拿不到現成的物件——項目帶的是宣告本身,CTE 什麼都沒帶——所以 先由 Ssms22/Completion/SqlSuggestionTarget 從名稱認出種類(這份清單已排除暫存 程序,井號、小老鼠各只剩一個意思),資料行等到使用者真的按下向右鍵才去問名冊。換選取在每一次方向鍵上, 掃整份文字要等到有人要看才划算;名冊照文字版本留著,按著方向鍵走完一輪只掃一次。 名稱認得出來、資料行卻讀不出來(SELECT * INTO #Loan FROM dbo.Loan:那份名單只有 中繼資料知道)時說明實情,不畫一個空的結構讓人以為它真的沒有欄位。

標題沒有結構描述時整段前綴都不寫(SqlObjectInfo.SchemaPrefix):[].[#TempTest] 宣稱有一個叫空字串的結構描述,而 [dbo].[@rows] 連文法都不成立。圖示與建議清單 同一個,三種都是「表格加一份指令碼」,與資料庫資料表分得開。

以 Apache-2.0 授權條款發布 · 專為 SSMS 22 設計