首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

ASP.NET 呼叫預存程序 vs 直寫 SQL:T-SQL 與標準 SQL 差異解析

     編輯:關於SqlServer

預存程序在 B/S 系統的地位

  • 廣泛用於資料存取層,封裝業務邏輯、減少網路往返、利用執行計畫快取。
  • 三類回傳型別:
    1. **結果集** (SELECT)
    2. **純量值** (SCALAR:SELECT @val = ... / RETURN)
    3. **行為型** (DML 無回傳,僅副作用)
  • 首次執行編譯生成計畫,後續直接從快取重用 (Plan Cache),效能優於動態 SQL。

兩種呼叫方式 (ADO.NET)


// 1. SqlCommand + CommandType.StoredProcedure
cmd.CommandText = "usp_GetUser";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@UserId", id);

// 2. 直寫 SQL (參數化)
cmd.CommandText = "SELECT * FROM Users WHERE UserId = @UserId";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@UserId", id);

**建議**:預存程序為主,動態/臨時查詢用參數化 Text。避免字串拼接防注入。

T-SQL vs 標準 SQL (ANSI/ISO)

維度標準 SQL (ANSI/ISO)T-SQL (Sybase/MS 衍生)
定位跨資料庫可攜式基準SQL Server / Sybase 專用擴展
程式控制PSM (SQL/PSM) 標準IF/ELSE, WHILE, TRY/CATCH, GOTO, 變數宣告 DECLARE @v INT
錯誤處理無標準化TRY...CATCH, THROW, @@ERROR, RAISERROR
暫存表不支援#temp (Session)、##temp (Global)、表變數 @t TABLE(...)
動態 SQLEXECUTE IMMEDIATEEXEC(@sql), sp_executesql (參數化、計畫重用)
內建函數標準子集ISNULL, COALESCE, GETDATE(), NEWID(), ROW_NUMBER() 等大量擴展
鎖提示無WITH (NOLOCK), UPDLOCK, HOLDLOCK, READPAST
分頁 (2012+)OFFSET ... FETCH同標準,早期用 TOP + NOT IN / ROW_NUMBER()

歷史淵源

SQL Server 6.x 核心源自 **Sybase SQL Server**,T-SQL 即 Sybase 方言。微軟取得授權後獨立演進,保留核心語法相容性。

選擇建議

  • **專案鎖定 SQL Server 長期使用** → 大方使用 T-SQL 進階功能 (暫存表、Table-Valued Parameters、CLR 整合、Columnstore、In-Memory OLTP)。
  • **需支援多資料庫 (Oracle/PostgreSQL/MySQL)** → 核心邏輯用標準 SQL + ORM (EF Core/Dapper) 吸收差異,預存程序僅作效能關鍵路徑且各庫維護一份。
  • **新專案** → 優先參數化 Text + ORM,預存程序留給報表/批次/高併發熱點。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved