如果您將 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 函數 |
轉換 |
||
轉換 |
||
轉換 |
||
轉換 |
||
轉換 |
||
轉換 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
日期/時間 |
||
範圍聚合 |
||
數學 |
||
數學 |
||
數學 |
||
數學 |
||
數學 |
||
數學 |
||
數學 |
||
數學 |
||
數學 |
||
數學 |
||
數學 |
||
程式流程 |
||
程式流程 |
||
統計資料 |
||
SQL 彙總 |
||
SQL 彙總 |
||
SQL 彙總 |
||
SQL 彙總 |
||
SQL 彙總 |
||
文字 |
||
文字 |
||
文字 |
||
文字 |
||
文字 |
||
文字 |
||
文字 |
||
文字 |
||
文字 |