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

Access 遷移 SQL Server 核心難點:動態 SQL 改寫為參數化預存程序

     編輯:關於SqlServer

Access 應用常大量使用動態 SQL (字串拼接 WHERE 條件),直接連接 SQL Server 存在三大缺點:

  1. 邏輯在用戶端執行,無法利用伺服器運算資源。
  2. 解析控制項、拼接 SQL 程式碼冗長難維護。
  3. 極易遭受 SQL Injection 攻擊。

遷移兩大任務

  1. 識別所有非命名查詢 的記錄來源 (RecordSource/RowSource)。
  2. 全部改寫為參數化預存程序 或參數化檢視表。

動態 SQL 改寫範例

Access 原始模式 (假設兩個控制項)

-- 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 特有物件對應表

遷移檢查清單

  1. 匯出結構:SSMA for Access (SQL Server Migration Assistant) 自動轉換資料型別、索引、關聯。
  2. 資料遷移:SSMA 或 INSERT INTO ... SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', ...)。
  3. 查詢改寫:逐一將動態 SQL 改為參數化預存程序,建立命名查詢目錄。
  4. 前端改造:Access ADP/ODBC 連接、ADO.NET 參數化呼叫、移除字串拼接。
  5. 測試驗證:功能測試、效能基準比對、SQL Injection 滲透測試。

徹底消除動態 SQL 字串拼接,改用參數化預存程序,是 Access 遷移 SQL Server 成功與否的關鍵分水嶺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
Access 物件SQL Server 對應
查詢檢視表 / 內嵌資料表值函數 / 預存程序
表單 RecordSource預存程序 / 參數化檢視表
報表 RecordSource預存程序 / 檢視表
下拉式方塊 RowSource檢視表 / 純量函數回傳 XML/JSON
巨集/模組 VBACLR 預存程序 / T-SQL 程式碼