[英]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變量只有變量范圍的生命周期。
至於你提出的其他問題:
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.