sql server denali ctp3中新增存儲過程abc後,能使用EXEC abc,但是abc下有紅線,提示找不到存儲過程“abc”,將sql server 關閉後重新打開,紅線纔會消失,請問爲什麼?該怎麼辦?
原因是這樣的. 你的 SQL Server 客戶端, 在連接到 SQL Server 數據庫以後。 會自動讀取 數據庫的 數據字典信息。 也就是 當前數據庫, 有哪些表/字段/視圖/存儲過程 等 基礎信息。 保存在客戶端的 內存裏面。 這樣。當你在客戶端 輸入 SQL 語句的時候, 輸入 表名字. 會自動彈出 這個表的 字段列表, 讓你選擇。 但是, 當你新建了一個對象的時候, 例如表, 或者你的那個例子, 是 新建 存儲過程abc 這個時候, 數據庫那裏, 已經有 存儲過程 abc 了。 但是客戶端的緩存裏面, 並沒有 存儲過程 abc 的信息。 因爲內存裏面的信息,沒有更新。 因此,在客戶端那裏。 輸入 EXEC abc, abc下有紅線。 將 客戶端關閉後,重新打開, 由於客戶端 重新加載了 數據庫的基礎信息。 知道了 當前數據庫裏面, 有 一個名字叫 abc 的存儲過程 因此,就不出 紅線 了。
- 追問
-
謝謝你的回答 但是我的SQL SERVER 是安裝的自己的電腦上的,數據庫也存放在C盤的,爲什麼還要重新加載呢?我在公司用的SQL SERVER新增完了就能直接用了啊。
- 回答
-
SQL Server 的工作方式, 是 客戶端 - 服務器 的工作方式. 就算 SQL SERVER 是安裝的自己的電腦上的,數據庫也存放在C盤 但是你的機器上,實際上是運行了 2 個程序, 一個是 服務器程序, 一個是 客戶端程序。 客戶端 新建了存儲過程, 實際上是 把 SQL 代碼, 發送給 服務器程序。 服務器程序 編譯代碼的有效性,並存儲。 假如 編譯通過了, 那是可以運行的, 不管你數據庫存在本機, 還是存在服務器上面。 至於你本地的那個 紅線, 實際上是 客戶端的 本地的模擬的 編譯。 客戶端不管你代碼是否正確, 都是 發送給服務器那裏去 執行的。 因此你 abc下有紅線,提示找不到存儲過程“abc” 而 又能使用EXEC abc 這個就是 客戶端 認爲 服務器上面, 沒有 abc 這個存儲過程。 但是你執行 EXEC abc 客戶端 是隻能原樣的把這句話, 發給服務器 如果 服務器那裏, 真的沒有 abc 這個存儲過程 那麼會返回 服務器的 錯誤提示。 如果服務器有 abc 這個存儲過程 那麼就 返回 執行的結果。