如果你將 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 函數。