比較 Access SQL 和 SQL Server TSQL

套用到
Microsoft 365 Access Access 2024 Access 2021 Access 2019 Access 2016

如果你將 Access 資料遷移到 SQL Server,或建立以 SQL Server 作為後端資料庫的 Access 解決方案,了解 Access SQL 與 SQL Server Transact SQL (TSQL) 之間的差異至關重要。 以下是您需要了解的重要變化,以讓您的解決方案如預期運作。

欲了解更多資訊,請參閱 Access SQL:基本概念、詞彙與語法,以及 Transact-SQL 參考。

語法和運算式的差異

有幾個語法和運算式的差異需要轉換。 下表摘要最常見的差異項目。

差異 Access SQL SQL Server TSQL
關聯式資料庫屬性 通常稱為欄位 通常稱為資料行
字串常值 加上引號 ("),如 "Mary Q. Contrary" 加上單引號 ('),如 'Mary Q. Contrary'
日期常值 加上井字符號 (#),如 #1/1/2019# 加上單引號 ('),如 '1/1/2019'
多個萬用字元 加上星號 (*),如 "Cath*" 加上百分比 (%),如 'Cath%'
單一萬用字元 加上問號 (?),如 "Cath?" 加上底線 (_),如 "Cath_"
餘數運算子 加上 MOD 運算子,如 Value1 MOD Value2 加上百分比 (%),如 Value1 % Value2
布林值 WHERE Bitvalue = [True | False]

WHERE Bitvalue = [-1 | 0]
WHERE Bitvalue = [1 | 0]
參數 [<一個非定義欄位>的名稱]

在 SQL 檢視中,使用 SQL 參數宣告
@ParamName

附註

  • Access 會在表格名稱和物件周圍使用引號字元 (")。 T-SQL 可在有空格的資料表名稱使用它們,但這不是標準的命名做法。 在大多數情況下,應該重新命名不包含空格的物件名稱,但也必須重寫查詢,以反映新的資料表名稱。 在無法重新命名的表格使用括號 [],但這不符合命名標準。 Access 也會在查詢中的參數周圍加上額外的括號,但可以在 T-SQL 中移除這些括號。

  • 請考慮使用標準的日期格式 yyyy-mm-dd hh:nn:ss,這是儲存為字元之日期的 ODBC 標準,它提供了跨資料庫的一致表示方式,並保留了日期排序順序。

  • 若要在比較布林值時避免混淆,您也可以使用下列 Access 和 SQL Server 的比較:

    • 假值測試 其中位元值 = 0
    • 真實值測試 其中位元值 <> 為 0

Null 值

空值並非表示「完全沒有值」的空欄位。 Null 值是表示資料遺失或不明的預留位置。 識別空值的資料庫系統實作「三值邏輯」,意即某物可能是真、假或未知。 如果你沒有正確處理空值,在做等式比較或評估 WHERE 子句時,可能會得到錯誤的結果。 以下是 Access 和 SQL Server 如何處理 Null 值的比較。

停用表格中的 Null 值

在 Access 和 SQL Server 中,預設會啟用 Null 值。 若要停用表格資料行中的 Null 值,請執行下列動作:

  • 在 Access 中,將欄位的 Required 屬性設為 [是]。
  • 在 SQL Server 中,將 NOT Null 屬性新增到 CREATE TABLE 陳述式中的資料行。

在 WHERE 子句測試 Null 值

使用 IS Null 和 IS NOT Null 比較述詞:

  • 在 Access 中,使用 IS Null 或 IS NOT Null。 例如:

    SELECT … WHERE column IS NULL.
    
  • 在 SQL Server 中,使用 IS Null 或 IS NOT Null。 例如:

    SELECT … WHERE field IS NULL
    

使用函數轉換 Null 值

使用 Null 函數來保護您的運算式,並傳回其他值:

  • 在 Access 中,使用 NZ (value, [valueifNull]) 函數會傳回 0 或另一個值。 例如:

    SELECT AVG (NZ (Weight, 50) ) FROM Product
    
  • 在 SQL Server 中,使用 ISNull(Value, replacement_value) 函數會傳回 0 或另一個值。 例如:

    SELECT AVG (ISNULL (Weight, 50)) FROM Product
    

了解資料庫選項

某些資料庫系統會有專屬的機制:

  • 在 Access 中,沒有與 Null 相關的資料庫選項。
  • 在SQL Server中,你可以使用 SET ANSI_NULLS OFF 選項,利用 = 和<>運算子直接比較 NULL。 我們建議您避免使用此選項,因為此選項已過時,並且可能會使依賴符合 ISO 空值處理方式的其他人感到困惑。

轉換和轉型

無論是使用資料或程式設計,都會有需要從某種資料類型轉換為另一種資料類型的時候。 轉換程序可以簡單,也可以複雜。 您需要考慮的常見問題包括:隱含或明確轉換、目前日期和時區設定、數字的進位或捨去以及資料類型大小。 沒有什麼能取代徹底的檢測與結果確認。

在 Access 中,您可以使用以字母 C 開頭的 11 個類型轉換函數,各適用一個資料類型。 例如,若要將浮點數字轉換為字串:


CStr(437.324) returns the string "437.324".

在 SQL Server 中,主要使用 CAST 和 CONVERT TSQL 函式,雖然也有其他轉換數以滿足特殊需求。 例如,若要將浮點數字轉換為字串:


CONVERT(TEXT, 437.324) returns the string "437.324"

DateAdd、DateDiff 和 DatePart 函數

在 Access 和 TSQL 中,這些常用的日期函數是類似的 (DateAdd、DateDiff 和 DatePart),但使用的第一個引數則會不同。

  • 在 Access 中,第一個參數稱為 區間,是一個需要引號的字串表達式。

  • 在 SQL Server 中,第一個參數稱為 datepart,它使用不需要引號的關鍵字值。

    組成部分 Access SQL Server
    "yyyy" year, yy, yyyy
    "q" quarter, qq, q
    "m" month, mm, m
    日期 "y" dayofyear, dy, y
    "d" day, dd, d
    "ww" wk, ww
    星期幾 "w" weekday, dw
    小時 "h" hour, hh
    分鐘 "n" minute, mi, n
    "s" second, ss, s
    毫秒 millisecond, ms

函數比較

Access 查詢可以包含有時使用 Access 函數來獲得結果的計算資料行。 當您將查詢移轉至 SQL Server時,您需要使用相等的 TSQL 函數取代 Access 函數 (如果有)。 如果沒有對應的 TSQL 函式,通常可以 建立一個計算欄位 (TSQL 中用來指計算欄位的術語) 達成你想要的功能。 TSQL 有各種功能,看看有哪些功能對你很有幫助。 欲了解更多資訊,請參閱 SQL 資料庫函式是什麼?

下表顯示哪些 Access 函數有對應的 TSQL 函數。

Access 類別 Access 函數 TSQL 函數
轉換 Chr 函數 CHAR
轉換 Day 函數 DAY
轉換 FormatNumber 函數 節目形式
轉換 FormatPercent 函數 節目形式
轉換 Str 函數 STR
轉換 類型轉換函數 演員與轉換
日期/時間 Date 函數 CURRENT_TIMESTAMP
日期/時間 Day 函數 日期來源
日期/時間 DateAdd 函數 DATEADD
日期/時間 DateDiff 函數 DATEDIFF
DATEDIFF_BIG
日期/時間 DatePart 函數 日期部分
日期/時間 DateSerial 函數 日期來源
日期/時間 DateValue 函數 日期名稱
日期/時間 Hour 函數 時間從部分
日期/時間 Minute 函數 時間從部分
日期/時間 Month 函數 MONTH
日期/時間 Now 函數 系統日期時間
日期/時間 Second 函數 時間從部分
Time 函數 時間從部分
日期/時間 TimeSerial 函數 時間從部分
日期/時間 Weekday 函數 日期部分
日期名稱
日期/時間 Year 函數 YEAR
日期來源
範圍聚合 DFirst 與 DLast 函數 FIRST_VALUE
LAST_VALUE
數學 Abs 函數 ABS
數學 Atn 函數 ATAN
ATN2
數學 Cos 函數 COS
ACOS
數學 Exp 函數 EXP
數學 Int 與 Fix 函數 FLOOR
數學 Log 函數 LOG
LOG10
數學 Rnd 函數 RAND
數學 Round 函數 ROUND
數學 Sgn 函數 SIGN
數學 Sin 函數 SIN
數學 Sqr 函數 SQRT
程式流程 Choose 函數 CHOOSE
程式流程 IIf 函數 IIF
統計資料 Avg 函數 AVG
SQL 彙總 Count 函數 COUNT
COUNT_BIG
SQL 彙總 Min 與 Max 函數 MIN
MAX
SQL 彙總 StDev 與 StDevP 函數 STDEV
STDEVP
SQL 彙總 Sum 函數 SUM
SQL 彙總 Var 與 VarP 函數 VAR
VARP
文字 Format 函數 節目形式
文字 LCase 函數 LOWER
文字 Left 函數 左邊
文字 Len 函數
文字 LTrim、RTrim 與 Trim 函數 TRIM
LTRIM
RTRIM
文字 Replace 函數 替換
文字 Right 函數
文字 StrReverse 函數 背面
文字 UCase 函數 UPPER