比較 Access SQL 和 SQL Server TSQL
Applies ToAccess for Microsoft 365 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 的比較:

    • 測試 False 值    WHERE Bitvalue = 0

    • 測試 True 值    WHERE Bitvalue <> 0

Null 值

Null 值不是表示「完全沒有值」的空白欄位。 Null 值是表示資料遺失或不明的預留位置。 識別 Null 值的資料庫系統採用「三值邏輯」,這表示值可以是True、False 或不明。 如果您未正確處理 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 and CONVERT TSQL 函數,但還是有針對特殊需求的其他轉換函數。 例如,若要將浮點數字轉換為字串:

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

DateAdd、DateDiff 和 DatePart 函數

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

  • 在 Access 中,第一個引數名為 interval,是需要以引號括住的字串運算式。

  • 在 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 函數

FORMAT

轉換

FormatPercent 函數

FORMAT

轉換

Str 函數

STR

轉換

類型轉換函數

CAST 和 CONVERT

日期/時間

Date 函數

CURRENT_TIMESTAMP

日期/時間

Day 函數

DATEFROMPARTS

日期/時間

DateAdd 函數

DATEADD

日期/時間

DateDiff 函數

DATEDIFF

DATEDIFF_BIG

日期/時間

DatePart 函數

DATEPART

日期/時間

DateSerial 函數

DATEFROMPARTS

日期/時間

DateValue 函數

DATENAME

日期/時間

Hour 函數

TIMEFROMPARTS

日期/時間

Minute 函數

TIMEFROMPARTS

日期/時間

Month 函數

MONTH

日期/時間

Now 函數

SYSDATETIME

日期/時間

Second 函數

TIMEFROMPARTS

Time 函數

TIMEFROMPARTS

日期/時間

TimeSerial 函數

TIMEFROMPARTS

日期/時間

Weekday 函數

DATEPART

DATENAME

日期/時間

Year 函數

YEAR

DATEFROMPARTS

範圍聚合

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 函數

FORMAT

文字

LCase 函數

LOWER

文字

Left 函數

LEFT

文字

Len 函數

LEN

文字

LTrim、RTrim 與 Trim 函數

TRIM

LTRIM

RTRIM

文字

Replace 函數

REPLACE

文字

Right 函數

RIGHT

文字

StrReverse 函數

REVERSE

文字

UCase 函數

UPPER

Need more help?

Want more options?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。

社群可協助您詢問並回答問題、提供意見反應,以及聆聽來自具有豐富知識的專家意見。