Access 應用常大量使用動態 SQL (字串拼接 WHERE 條件),直接連接 SQL Server 存在三大缺點:
-- VBA 動態拼接
strSQL = "SELECT * FROM SomeTable WHERE 1=1"
If Not IsNull(Forms!myForm!Control1) Then
strSQL = strSQL & " AND Column1 = " & Forms!myForm!Control1
End If
If Not IsNull(Forms!myForm!Control2) Then
strSQL = strSQL & " AND Column2 = '" & Forms!myForm!Control2 & "'"
End If
Me.RecordSource = strSQL
CREATE PROCEDURE usp_GetData
@Param1 INT = NULL,
@Param2 NVARCHAR(50) = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM SomeTable
WHERE (@Param1 IS NULL OR Column1 = @Param1)
AND (@Param2 IS NULL OR Column2 = @Param2);
END
GO
呼叫端 (ADO.NET/VBA) 僅需傳遞參數,NULL 代表不篩選,邏輯集中於伺服器端。
WHERE (Column1 = @Param1 OR @Param1 IS NULL)
AND (Column2 = @Param2 OR @Param2 IS NULL)
-- 最佳化器可依參數值產生最佳計畫 (參數嗅探),必要時加 OPTION (RECOMPILE)
| Access 物件 | SQL Server 對應 |
|---|---|
| 查詢 | 檢視表 / 內嵌資料表值函數 / 預存程序 |
| 表單 RecordSource | 預存程序 / 參數化檢視表 |
| 報表 RecordSource | 預存程序 / 檢視表 |
| 下拉式方塊 RowSource | 檢視表 / 純量函數回傳 XML/JSON |
| 巨集/模組 VBA | CLR 預存程序 / T-SQL 程式碼 |