SQL 中的存儲過程 | 概述

SQL 中的存儲過程 | 概述

在此博客中,我們將討論 SQL 中的存儲過程,您可以利用它來保存一組代碼並在需要時重複使用它。存儲過程類似於視圖。但是,您可以使用無法使用視圖執行的存儲過程執行常見的表操作,例如 DROP、TRUNCATE、DELETE 等。

存儲過程也是預編譯的,因此它比視圖運行得更快。它還最大限度地減少了發送到數據庫服務器的數據量。

目錄

SQL 中存儲過程的語法:無參數

要創建不帶參數的存儲過程,您需要從CREATE函數開始。然後添加PROC函數,在後面鍵入過程名稱,然後添加AS函數。

SQL 中的存儲過程 |  概述

中創建存儲過程類似於創建表和視圖。但是,區別在於獲取數據的過程。

例如,如果我們想從視圖中獲取數據,我們使用“ SELECT * FROM view_name ”。另一方面,對於存儲過程,我們使用 EXEC,意思是“執行”,然後在後面鍵入存儲過程名稱

SQL 中的存儲過程 |  概述

一旦我們執行存儲過程,它也會根據您添加的指令或命令顯示信息。

SQL 中存儲過程的語法:帶參數

讓我們開始。該過程類似於我之前演示的示例。唯一的區別是您需要在AS函數之前包括參數以及緊隨其後的數據類型。

SQL 中的存儲過程 |  概述

您還可以使用在命令中創建存儲過程時聲明的參數。這是為了節省您輸入多個值的時間。例如,我們沒有手動輸入customerID1customerID2等,而是使用@custid或參數來避免編寫一長串代碼。

SQL 中的存儲過程 |  概述

請注意,在使用或包含參數時,使用@符號很重要。您還可以根據需要包含任意多個參數,而不僅僅是一個。這就是我們如何執行帶參數的存儲過程。

SQL 中的存儲過程 |  概述

正如您所注意到的,我們在執行存儲過程時也使用了值等於1的參數。這將只帶來custid1的信息。

SSMS 中存儲過程的示例場景

讓我們在 SQL 中有更多的存儲過程示例。首先,我將使用下面突出顯示的命令創建示例存儲過程。

SQL 中的存儲過程 |  概述

對於創建存儲過程的命名約定,我們通常使用“usp”或“sp”來表示這是一個存儲過程。如果您想知道“usp”是什麼意思,它只是代表用戶定義的存儲過程。 

接下來,我們將為存儲過程編寫查詢,以便在執行時進行處理。

SQL 中的存儲過程 |  概述

上一個示例中的查詢將簡單地刪除名為dbo.stageOrders的表。然後它將使用Sales.SalesOrderHeader表中的數據重新創建dbo.stageOrders。 

讓我們 通過突出顯示以下代碼並單擊“執行”按鈕來創建此存儲過程。

SQL 中的存儲過程 |  概述

之後,您應該會看到這樣的消息。

SQL 中的存儲過程 |  概述

然後我們現在將通過運行EXEC usp_TEST來執行存儲過程。

SQL 中的存儲過程 |  概述

在執行usp_TEST存儲過程後,dbo.stageOrders現在應該具有來自Sales.SalesOrderHeader的數據。讓我們通過運行以下命令來檢查dbo.stageOrders的內容。

SQL 中的存儲過程 |  概述

因此,這些是我們根據添加到存儲過程中的命令在dbo.stageOrders中創建的數據。

SQL 中的存儲過程 |  概述

第二個示例場景

讓我們繼續看另一個例子。這次我不想刪除dbo.stageOrders表並使用來自Sales.SalesOrderHeader表的數據重新創建同一個表。

相反,我只想在執行“ usp_TEST存儲過程時顯示 Sales.SalesOrderHeader 表中的數據。

為了執行此操作,我需要使用ALTER語句對最近創建的存儲過程進行更改。

SQL 中的存儲過程 |  概述

在此示例中,我們使用了用於修改存儲過程的ALTER語句。您還可以將其應用於視圖和表。一旦我們運行上面屏幕截圖中的代碼,它應該更改要由我們的存儲過程處理的查詢。

這次它不會像我們之前那樣重新創建任何表。如果我們執行“ usp_TEST ”,它只會從Sales.SalesOrderHeader表中獲取數據。

SQL 中的存儲過程 |  概述

SQL 中的存儲過程 |  概述

第三個示例場景

讓我們再舉一個例子。這次我們將重用在第一個在SSMS中創建存儲過程的示例中使用的 dbo.stageOrders 表。我們將從選擇 dbo.stageOrders 表開始此示例 。 

SQL 中的存儲過程 |  概述

從 dbo.stageOrders 選擇所有數據後的結果應該是這樣的。

SQL 中的存儲過程 |  概述

現在讓我們通過執行usp_TEST清空 dbo.stageOrders 表。我們可以通過添加以下命令來做到這一點。

SQL 中的存儲過程 |  概述

添加TRUNCATE TABLE命令後,我們需要更新usp_TEST

SQL 中的存儲過程 |  概述

之後,應顯示一條消息,說明命令已成功完成。然後我們將再次執行usp_TEST

SQL 中的存儲過程 |  概述

執行usp_TEST後,它將顯示Sales.SalesOrderHeader中的所有記錄,並清空dbo.stageOrders表。 

SQL 中的存儲過程 |  概述

要檢查 dbo.stageOrders 表是否為空,我們需要使用以下命令選擇它並執行。

SQL 中的存儲過程 |  概述

運行上面的代碼後,我們可以看到 dbo.stageOrders 表現在是空的。這是由於我們用來更新usp_TEST 的TRUNCATE TABLE命令。

SQL 中的存儲過程 |  概述

SQL中保存的存儲過程的位置

如果您想查看SQL 中存儲過程的保存位置,請轉到左側的“對象資源管理器”面板,然後單擊您正在處理的數據庫前的“ + ”圖標。

SQL 中的存儲過程 |  概述

然後右鍵單擊Programmability選擇Refresh

SQL 中的存儲過程 |  概述

SQL 中的存儲過程 |  概述

單擊“ + ”圖標展開Programmability文件夾或組。然後通過執行相同的步驟展開存儲過程組。在存儲過程組中,您應該看到dbo.usp_TEST

SQL 中的存儲過程 |  概述

SQL 中的存儲過程 |  概述

如果要檢查 SQL 中特定存儲過程 正在執行哪些命令或查詢,可以右鍵單擊存儲過程 並按照下面屏幕截圖中的步驟操作。

SQL 中的存儲過程 |  概述

之後,它將在不同的選項卡中打開存儲過程,您可以在其中查看其中提供的命令。這是打開dbo.usp_TEST時的樣子。

SQL 中的存儲過程 |  概述

如您所見,在CREATE語句之前有一些默認命令。如果你願意,你可以簡單地刪除它。 

SQL 中的存儲過程 |  概述

現在您知道瞭如何檢查SQL 中的存儲過程正在執行的命令。

使用參數在 SQL 中創建存儲過程

接下來,我們將創建一個帶參數的存儲過程。例如,我們將使用以下代碼創建一個新的存儲過程。

SQL 中的存儲過程 |  概述

在示例代碼中,我使用相同的過程創建名為usp_GetCustomer的存儲過程。然後我添加了一個@CustomerID參數,輸入類型為INT

請注意,一旦您在創建存儲過程時添加了一個參數,您就應該始終在要執行命令時提供一個參數。

讓我們看看如果我們在不提供參數的情況下執行usp_GetCustomer會發生什麼。

SQL 中的存儲過程 |  概述

在不帶參數的情況下執行usp_GetCustomer時,會出現一條錯誤消息。這就是我們使用參數執行usp_GetCustomer時的樣子。

SQL 中的存儲過程 |  概述

通過提供參數,我們能夠在執行存儲過程時獲得正確的結果。

創建具有默認值的存儲過程

如果要避免在執行帶參數的存儲過程時收到錯誤消息,可以設置一個默認值作為默認參數。

例如,我們將創建一個名為usp_GetOrdersByYear的存儲過程。

然後我將添加一個參數@OrderYear,輸入類型為“ INT ”,默認值等於2011

SQL 中的存儲過程 |  概述

如果我們在沒有提供參數的情況下執行usp_GetOrdersByYear,它將顯示2011 年的記錄。

SQL 中的存儲過程 |  概述

SQL 中的存儲過程 |  概述

另一方面,如果我們以2014作為給定參數執行usp_GetOrdersByYear,它應該顯示2014年的記錄。

SQL 中的存儲過程 |  概述

SQL 中的存儲過程 |  概述

這就是您在日常數據管理任務中使用存儲過程的方式。

SQL 聚合函數中的 HAVING 子句
ISNULL SQL 函數在 Case 語句中的
SQL 數據提取使用 OFFSET 和 FETCH

結論

綜上所述,您已經了解了 SQL 中的存儲過程及其用途。我們還討論了用於在當前存儲過程中進行更改或更新的ALTER語句。

此外,您還了解了在 SQL 中創建存儲過程的不同方法,並了解瞭如何通過提供默認值來避免在執行存儲過程時收到錯誤。

最重要的是,您學會了利用存儲過程來存儲命令集,以避免重複運行長代碼集。最後提醒一下,不要忘記在提供參數時使用“ @ ”符號。

一切順利,

哈菲茲


什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

如何在 R 中保存和加載 RDS 文件

如何在 R 中保存和加載 RDS 文件

您將學習如何在 R 中保存和加載 .rds 文件中的對象。本博客還將介紹如何將對像從 R 導入 LuckyTemplates。

回顧前 N 個工作日——DAX 編碼語言解決方案

回顧前 N 個工作日——DAX 編碼語言解決方案

在此 DAX 編碼語言教程中,了解如何使用 GENERATE 函數以及如何動態更改度量標題。

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

本教程將介紹如何使用多線程動態可視化技術從報告中的動態數據可視化中創建見解。

LuckyTemplates 篩選上下文簡介

LuckyTemplates 篩選上下文簡介

在本文中,我將貫穿過濾器上下文。篩選上下文是任何 LuckyTemplates 用戶最初應該了解的主要主題之一。

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

我想展示 LuckyTemplates Apps 在線服務如何幫助管理從各種來源生成的不同報告和見解。

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

了解如何在 LuckyTemplates 中使用度量分支和組合 DAX 公式等技術計算利潤率變化。

DAX Studio 中數據緩存的物化想法

DAX Studio 中數據緩存的物化想法

本教程將討論數據緩存物化的想法,以及它們如何影響 DAX 在提供結果時的性能。

使用 LuckyTemplates 進行業務報告

使用 LuckyTemplates 進行業務報告

如果直到現在你還在使用 Excel,那麼現在是開始使用 LuckyTemplates 來滿足你的業務報告需求的最佳時機。

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的