2010-09-22 72 views
57

我已經使用了兩者,但我不清楚的是當我更喜歡一個在另一個。我的意思是我知道存儲過程可以採用參數...但我們真的可以仍然使用視圖執行相同的事情嗎?存儲過程比。查看

因此,考慮性能和其他方面的時間和爲什麼我應該比另一方更喜歡?

+7

您應考慮包含用戶定義的功能。 – 2010-09-22 20:27:09

+0

似乎這是一個重複:[保留SQL與存儲過程與代碼有什麼優點和缺點](http://stackoverflow.com/questions/15142/what-are-the-pros-and-cons-to -keeping-sql-in-stored-procs-versus-code),這也是一個社區Wiki。 – Hibou57 2013-08-18 10:23:42

回答

34

那麼,我會使用存儲過程更好地封裝代碼和控制權限。

視圖並不是真正的封裝:它是一個擴展的宏。如果你很快就開始加入視圖,你會有一些可怕的查詢。是的,他們可以加入,但他們不應該..

說,視圖是一個工具,有他們的地方(例如索引視圖)像存儲過程。

+0

這個答案對我來說非常重要。但我想知道,如何運行視圖,因爲我知道如何運行存儲過程作爲exec spName.please指導我。 – Freelancer 2013-05-09 10:14:02

+1

@Freelancer:'SELECT * FROM View',就像表格 – gbn 2013-05-09 10:15:17

18

視圖的優點是它們可以像表格一樣對待。您可以使用WHERE從它們獲取過濾的數據,加入它們等等。如果足夠簡單,你甚至可以將數據插入到它們中。與存儲過程不同,視圖還允許您爲結果編制索引。

+4

加入是*不是一個很好的理由。 – gbn 2010-09-22 20:23:48

+2

@gbn:爲什麼不...? – 2010-09-22 20:24:47

+3

查看我的回答...?心態是「我們可以爲我們提供所有這些東西」,然後查看連接視圖連接視圖=對基表的可怕查詢。看到它,之前修好幾次。並回答了這個問題http://stackoverflow.com/search?q=user%3A27535+macro%2Bview – gbn 2010-09-22 20:29:47

11

存儲過程的主要優點是它們允許您合併邏輯(腳本)。這個邏輯可以像IF/ELSE一樣簡單,或者更復雜,比如DO WHILE循環,SWITCH/CASE。

3

如果某個表的組合或您希望查詢的數據的子集(例如,用其權限加入的用戶),則視圖很有用。事實上,意見應視爲表格。

存儲過程是「編譯」的SQL代碼片斷,因爲它在哪裏運行比隨機的其他查詢更優化。存儲過程中的sql代碼的執行計劃已經生成,因此執行運行比普通的sql語句稍微平滑。

4

我將存儲過程的使用與數據庫中發送/接收事務的需求相關聯。也就是說,無論何時我需要將數據發送到我的數據庫,我都使用存儲過程。當我想要更新數據或查詢數據庫以獲取在我的應用程序中使用的信息時也是如此。

當您希望提供給定表格中字段的子集時,數據庫視圖非常適用,使您的MS Access用戶能夠查看數據而無需修改數據,並確保您的報告能夠生成預防性結果。

+4

首先,你不應該有MS Access用戶。其次,正確的安全和權限應該防止他們修改數據。沒意見。 – CaffGeek 2010-09-22 20:29:08

11

查看就像一個保存的查詢語句,它不能包含複雜的邏輯或多個語句(超出使用union等)。對於任何複雜或可通過參數定製的選項,您都可以選擇允許更大靈活性的存儲過程。

在數據庫體系結構中使用視圖和存儲過程的組合很常見,也許出於非常不同的原因。有時候是爲了在架構重新設計時實現向後兼容性,有時爲了使數據更易於操縱,與原本存儲在表中的方式(非非視圖化視圖)相比。

大量使用Views可能會降低性能,因爲SQL Server更難以優化這些查詢。但是,可以使用索引視圖,這些索引視圖可以像索引表一樣使用聯接來提高性能。在實現索引視圖時允許使用的語法有很多更嚴格的限制,並且根據SQL Server的版本實際使它們工作時有很多細微之處。

認爲視圖比存儲過程更像表。

0

兩個基本原理。

如果不希望插入成爲可能,請使用存儲過程而不是視圖。在視圖中插入可能不會給出它看起來要做的事情。它將在表中插入一行,該行可能與視圖中的查詢不匹配,然後該行將不會出現在視圖中;插入某處,但不是在聲明看起來的地方。

如果你不能從另一個存儲過程中使用存儲過程的結果(我從來沒有能夠使後者工作,至少在MySQL中)使用視圖。

21

存儲過程:的存儲過程是提高 數據庫客戶端/服務器應用程序的安全,效率和可用性預編譯的數據庫查詢。開發人員根據輸入和輸出變量指定存儲的 過程。然後,他們編譯數據庫平臺上的代碼並將其提供給開發人員以供在其他環境(例如Web應用程序)中使用的應用程序 。 所有主要的數據庫平臺,包括Oracle,SQL Server和MySQL都支持存儲過程。該技術的主要優勢在於預編譯執行效率顯着提高,客戶端/服務器流量減少, 代碼重用和抽象的開發效率提高,以及 固有的安全控制授予用戶對特定存儲過程的權限,而不是 底層數據庫表。

查看:數據庫視圖允許您創建在訪問時即時生成的「虛擬表」。視圖作爲SQL語句存儲在數據庫服務器的 上,該語句從一個或多個表中抽取數據並(可選)對該數據執行轉換。 用戶可以像查詢真實數據庫 表一樣查詢視圖。通常使用視圖來緩解安全問題 爲用戶提供對數據庫表 的某個視圖的訪問權限,而無需訪問基礎表本身。

enter image description here

+0

'刪除查詢'是什麼意思? – 2017-05-04 20:04:09

+0

謝謝。哪些書是引號和表格? – Tim 2017-11-11 19:33:26

+0

@ Z.I.J你引用了一些內容,但你沒有提到它的來源 – 2017-11-28 08:15:48

3

存儲過程:存儲過程是提高了安全性,效率和數據庫客戶端/服務器應用程序的可用性預編譯的數據庫查詢。開發人員根據輸入和輸出變量指定存儲過程。然後,他們在數據庫平臺上編譯代碼,並將其提供給應用程序開發人員用於其他環境(如Web應用程序)中。所有主要的數據庫平臺,包括Oracle,SQL Server和MySQL都支持存儲過程。該技術的主要優勢在於預編譯執行帶來的顯着性能提升,客戶端/服務器流量的減少,代碼重用和抽象的開發效率提升以及賦予用戶對特定存儲過程而不是基礎數據庫表的權限。

視圖:數據庫視圖允許您創建在訪問時即時生成的「虛擬表」。視圖作爲SQL語句存儲在數據庫服務器上,該語句從一個或多個表中提取數據,並(可選)對該數據執行轉換。用戶可以像查看真實的數據庫表一樣查詢視圖。通常使用視圖來緩解安全問題,方法是向用戶提供對數據庫表的某個視圖的訪問權限,而無需訪問基礎表本身。