Ssms

如何讓 IntelliSense 理解臨時表、連結伺服器和同義詞?

  • October 2, 2019

我正在使用 SSMS 17.6,這是發佈時的最新版本。它應該具有最新的官方 IntelliSense 版本。但是,它在我使用臨時表、連結伺服器表和同義詞的地方用紅色波浪線突出了我的腳本。編輯查詢很困難,因為我沒有得到正確的錯誤檢測。一切都充滿了“錯誤”,但查詢執行,結果是我想要的,正如預期的那樣。

我嘗試了一些第三方外掛,如 SQL Complete 和 SSMSBoost,但它們似乎並沒有改進 IntelliSense,而是以其他方式擴展 SSMS,如工具提示和彈出視窗。或者,也許我只是還沒弄清楚如何使用它們來改進 IntelliSense。

我該怎麼做才能讓 IntelliSense 正確處理這些事情?如果沒有第一方方式,那麼存在哪些第三方擴展以及如何配置它們以改進錯誤突出顯示?

簡而言之,Intellisense 並不像它的名字所暗示的那樣智能。

臨時表

如果您正在使用跨不同數據庫或單獨查詢視窗的臨時表,Intellisense 不會認為該表存在,因為它不知道它不存在。這種情況通常有兩種情況:

  1. 在執行時,我們知道將執行第一個命令,而當我們開始執行另一個命令時,該表將存在。但要求 Intellisense 了解尚未發生的事情是不可能的。這通常涉及由不同的程序、查詢視窗等創建的臨時表。它通常只知道自己的查詢視窗和非 tempdb 數據庫中的對象的範圍。
  2. 如果它確實已經存在,那麼了解 tempdb 中已經存在的所有內容可能是一個性能問題(只是推測),因為那裡的東西時不時地快速移動,並且很難/不太可能獲得可靠的列舉有效期超過幾秒鐘的對象。無論如何,它只是不知道關於 tempdb 對象的單個查詢視窗之外的太多資訊。

連結伺服器

這一種是有道理的。每次編寫涉及遠端對象的查詢時,您真的希望 Intellisense 去查詢您的連結伺服器嗎?它只是不知道,所以假設它不存在。

同義詞

如果同義詞指的是連結的伺服器對象,那麼它們就會遇到上述問題。然而,就它們自己而言,它們應該可以很好地處理本地數據庫對象。

底線

學會忽略它,或者盡可能使用不同的 IDE(不使用 Intellisense 的)。儘管 Intellisense 存在缺陷,但大多數人似乎都喜歡它,但您也可以隨時將其完全關閉。

在這個 SO question有一個臨時表的 hacky 解決方法,但我個人永遠不會這樣做,因為你正在增加複雜性並降低程式碼的可讀性……紅色波浪線。

我知道這是一個老問題,但這似乎是 Intellisense 要求的犧牲。它類似於@LowleyDBA(可以說更好)答案中連結的文章。與連結的答案不同,這提供了一個安全而有力的保證,即您的桌子不會被 Intellisense 喜歡的東西弄亂。

IF OBJECT_ID('tempdb..##Example') IS NULL
  SELECT '0' AS ID, 'NotLoaded' AS Field1, 'every field needs to be defined here' AS Field2 INTO ##Example
IF EXISTS(SELECT TOP 1 * FROM ##Example WHERE Field1 LIKE 'NotLoaded')
  RAISERROR('Error : ##Example not loaded', 20, -1) WITH LOG

“RAIS”出錯會停止執行

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