SELECT @val = ... / RETURN)
// 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。避免字串拼接防注入。
| 維度 | 標準 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(...) |
| 動態 SQL | EXECUTE IMMEDIATE | EXEC(@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 方言。微軟取得授權後獨立演進,保留核心語法相容性。