簡體   English   中英

如何通過Sql Server和.Net處理存儲過程

[英]How is a stored procedure processed by Sql Server and .Net

我使用存儲過程超過1。5年。 但我從未考慮過如何從UI或其他存儲過程中檢索數據。

當我寫一個簡單的存儲過程。 例如。

CREATE PROCEDURE sp_test
AS
BEGIN
 SELECT * FROM tblTest --Considering table has 3 columns.
END

C#如何將此結果導入DataTable。

每當我必須在另一個過程中使用此過程的結果時,我認為我們必須使用table數據類型創建一個表值參數,並將其結果分配給表變量。 我從來沒有嘗試過。

CREATE PROCEDURE sp_testcall
AS
BEGIN
 @temp = exec sp_test -- I think this would be the way, never tried
END

如果上面的示例代碼為true,那么使用上述方法和查詢將記錄插入臨時表之間有什么區別?

CREATE PROCEDURE sp_test
AS
BEGIN
 SELECT * INTO #tmp FROM tblTest --Considering table has 3 columns.
END

似乎將結果復制到臨時表需要sql server的另一個努力。 但幕后會發生什么? 它會直接將結果的引用分配給表值參數,還是使用與臨時表相同的過程?

我的問題可能不太清楚。 但我會盡力改進。

對於初級到中級,您應該始終考慮#temp表和@table變量兩個相同硬幣的面。 雖然它們之間存在一些差異,但出於所有實際目的,它們的成本相同且行為幾乎完全相同。 唯一的主要區別是@table變量不會被事務處理,因此不會受到回滾的影響。

如果深入研究細節,#temp表的處理成本稍高(因為它們是交易的),但另一方面,@ table變量只有變量范圍的生命周期。

至於你提出的其他問題:

  • 表值參數始終是只讀的,您無法修改它們(插入/更新/刪除它們)
  • 將過程的結果集添加到表(真實表,#temp表或@tabel變量,無關緊要)只能通過使用INSERT INTO <table> EXEC sp_test
  • 根據經驗,產生另一個過程中所需結果的過程可能更好地作為用戶定義函數

Erland Sommarskog詳細分析了程序之間共享數據的主題,請參閱如何在存儲過程之間共享數據

select意味着“將數據返回給客戶”。 C#是一個客戶端,因此它獲取數據。
再說一遍,它不是C#,它是ADO.NET。 有一個數據提供程序知道如何使用網絡/內存/其他協議與SQL服務器通信並讀取它生成的數據流。 這個特定的客戶端(ADO.NET)使用接收到的數據來構造某些類,例如DataTable,其他提供者可以做一些完全不同的事情。
所有這些都與SQL Server級別無關,因為就服務器而言,數據已經使用建立連接的協議發送出去,就是這樣。

從內部來看,讓存儲過程返回只是select ed數據到其他任何東西都沒有多大意義。
當您需要這樣做時,您可以明確地告訴SQL Server您想要什么,例如將數據插入到兩個相關SP可用的臨時表中,將數據插入傳遞給過程的表值參數中,或重寫存儲過程作為返回表的函數。

再說一次,我對你所詢問的內容並不是很清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM