如果您將 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 位元值 <> 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 和 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 函數。