如果您將 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 值,則在進行相等比較或評估 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 中,第一個引數稱為 間隔,它是需要引號的字串運算式。
-
在 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 函數 |
|
轉換 |
||
|
轉換 |
||
|
轉換 |
||
|
轉換 |
||
|
轉換 |
||
|
轉換 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
日期/時間 |
||
|
範圍聚合 |
||
|
數學 |
||
|
數學 |
||
|
數學 |
||
|
數學 |
||
|
數學 |
||
|
數學 |
||
|
數學 |
||
|
數學 |
||
|
數學 |
||
|
數學 |
||
|
數學 |
||
|
程式流程 |
||
|
程式流程 |
||
|
統計資料 |
||
|
SQL 彙總 |
||
|
SQL 彙總 |
||
|
SQL 彙總 |
||
|
SQL 彙總 |
||
|
SQL 彙總 |
||
|
文字 |
||
|
文字 |
||
|
文字 |
||
|
文字 |
||
|
文字 |
||
|
文字 |
||
|
文字 |
||
|
文字 |
||
|
文字 |