ถ้าคุณโยกย้ายข้อมูล Access ของคุณไปยัง SQL Server หรือคุณสร้างโซลูชัน Access ด้วย SQL Server เป็นฐานข้อมูลส่วนหลัง คุณจําเป็นต้องทราบความแตกต่างระหว่าง Access SQL และ SQL Server Transact SQL (TSQL) ต่อไปนี้เป็นชุดรูปแบบสำคัญที่คุณต้องทราบเพื่อให้โซลูชันของคุณได้ผลตามที่ต้องการ
สําหรับข้อมูลเพิ่มเติม ให้ดู Access SQL: แนวคิดพื้นฐาน คําศัพท์ และไวยากรณ์ และ Transact-SQL Reference
ความแตกต่างระหว่างไวยากรณ์และนิพจน์
ไวยากรณ์และนิพจน์มีความแตกต่างบางประการที่ต้องมีการแปลง ตารางต่อไปนี้สรุปความแตกต่างที่พบบ่อยที่สุด
| ความแตกต่าง | 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 = [จริง | เท็จ] หรือ WHERE Bitvalue = [-1 | 0] |
WHERE Bitvalue = [1 | 0] |
| พารามิเตอร์ | [<ชื่อที่ไม่ใช่คอลัมน์>ที่กําหนด] หรือ ในมุมมอง SQL ให้ใช้การประกาศพารามิเตอร์ SQL |
@ParamName |
หมายเหตุ
Access ใช้อักขระเครื่องหมายคำพูด (") รอบชื่อตารางและวัตถุ T-SQL สามารถใช้ชื่อตารางที่มีช่องว่างได้ แต่นี่ไม่ใช่วิธีการตั้งชื่อมาตรฐาน ในกรณีส่วนใหญ่ ชื่อวัตถุควรเปลี่ยนใหม่ไม่ให้มีช่องว่าง แต่คิวรีก็ต้องเขียนใหม่เพื่อให้สะท้อนตามชื่อตารางใหม่เช่นกัน ใช้วงเล็บเหลี่ยม [] สำหรับตารางที่ไม่สามารถเปลี่ยนชื่อได้แต่ไม่เป็นไปตามมาตรฐานการตั้งชื่อ นอกจากนี้ X ยังเพิ่มวงเล็บพิเศษรอบพารามิเตอร์ในคิวรีอีกด้วย แต่สามารถนำออกได้ใน T-SQL
พิจารณาใช้รูปแบบวันที่มาตรฐาน yyyy-mm-dd hh:nn:ss ซึ่งเป็นมาตรฐาน ODBC สำหรับวันที่ที่จัดเก็บเป็นอักขระที่แสดงถึงวันที่ในฐานข้อมูลต่างๆ อย่างสอดคล้องกันและรักษาลำดับการเรียงวันที่
เพื่อไม่ให้สับสนเมื่อเปรียบเทียบค่าบูลีน คุณสามารถใช้การเปรียบเทียบต่อไปนี้สำหรับ Access และ SQL Server:
- ทดสอบหาค่าเท็จ WHERE Bitvalue = 0
- ทดสอบหาค่าจริง WHERE Bitvalue <> 0
ค่า Null
ค่า Null ไม่ใช่เขตข้อมูลว่างที่หมายถึง "ไม่มีค่าเลย" ค่า Null เป็นตัวยึดที่หมายความว่าข้อมูลนั้นหายไปหรือไม่รู้จัก ระบบฐานข้อมูลที่รู้จักค่า Null จะใช้ "ตรรกะสามค่า" ซึ่งหมายความว่าบางอย่างอาจเป็นจริง เท็จ หรือไม่รู้จัก ถ้าคุณจัดการกับค่า Null ไม่ถูกต้อง คุณสามารถรับผลลัพธ์ที่ไม่ถูกต้องเมื่อทําการเปรียบเทียบความเท่ากันหรือการประเมินส่วนคําสั่ง WHERE นี่คือการเปรียบเทียบวิธีที่ Access และ SQL Server จัดการกับค่า Null
ปิดใช้งานค่า Null ในตาราง
ใน Access และ SQL Server ประสบการณ์เริ่มต้นคือค่า Null จะเปิดใช้งาน เมื่อต้องการปิดใช้งานค่า Null ในคอลัมน์ตาราง ให้ทำดังต่อไปนี้:
- ใน Access ให้ตั้งค่าคุณสมบัติ จำเป็น ของเขตข้อมูลเป็นใช่
- ใน SQL Server ให้เพิ่มแอตทริบิวต์ NOT NULL ลงในคอลัมน์ในคำสั่ง CREATE TABLE
ทดสอบค่า Null ในส่วนคำสั่ง WHERE
ใช้เพรดิเคตการเปรียบเทียบ 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 โดยใช้ตัวดําเนินการ = และ<> เราขอแนะนำให้คุณหลีกเลี่ยงการใช้ตัวเลือกนี้เพราะไม่ได้รับการสนับสนุน และอาจทำให้ผู้อื่นสับสนที่ต้องพึ่งพาการจัดการแบบ Null ตามมาตรฐาน ISO
การแปลง
เมื่อใดก็ตามที่คุณทำงานกับข้อมูลหรือการเขียนโปรแกรม คุณจำเป็นต้องแปลงจากข้อมูลชนิดหนึ่งไปเป็นอีกชนิดหนึ่งอย่างต่อเนื่อง กระบวนการแปลงอาจง่ายดายหรือซับซ้อนก็ได้ ปัญหาทั่วไปที่คุณต้องพิจารณาคือ: การแปลงโดยปริยายหรือชัดแจ้ง การตั้งค่าภูมิภาควันที่และเวลาปัจจุบัน การปัดเศษหรือตัดทอนตัวเลข และขนาดชนิดข้อมูล ไม่มีสิ่งใดทดแทนการทดสอบอย่างละเอียดและการยืนยันผลลัพธ์ของคุณ
ใน Accessให้คุณใช้ ฟังก์ชันการแปลงชนิด ซึ่งมีสิบเอ็ดตัว แต่ละตัวเริ่มต้นด้วยตัวอักษร C โดยหนึ่งตัวสำหรับแต่ละชนิดข้อมูล ตัวอย่างเช่น เมื่อต้องการแปลงหมายเลขจุดลอยตัวเป็นสตริง:
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
ฟังก์ชันวันที่ที่ใช้กันทั่วไปเหล่านี้มีความคล้ายคลึงกัน (DateAdd, DateDiff และ DatePart) ใน Access และ TSQL แต่การใช้อาร์กิวเมนต์แรกนั้นแตกต่างกัน
ใน Access อาร์กิวเมนต์แรกเรียกว่า ช่วงเวลา และเป็นนิพจน์สตริงที่ต้องมีเครื่องหมายอัญประกาศ
ใน SQL Server อาร์กิวเมนต์แรกเรียกว่า datepart และใช้ค่าคําสําคัญที่ไม่ต้องใช้เครื่องหมายอัญประกาศ
คอม โพ เนนต์ Access SQL Server ปี "yyyy" ปี, yy, yyyy ไตรมาส "q" ไตรมาส, qq, q เดือน "m" เดือน, mm, m วันของปี "y" วันของปี, dy, y วัน "d" วัน, dd, d สัปดาห์ "ww" wk, ww วันของสัปดาห์ "w" วันทำงาน, dw ชั่วโมง "h" ชั่วโมง, hh นาที "n" นาที, mi, n วินาที "s" วินาที, ss, s มิลลิวินาที มิลลิวินาที, ms
การเปรียบเทียบฟังก์ชัน
คิวรี Access สามารถมีคอลัมน์ที่คำนวณแล้วซึ่งบางครั้งใช้ ฟังก์ชัน Access เพื่อให้ได้ผลลัพธ์ เมื่อคุณโยกย้ายคิวรีไปยัง SQL Server คุณต้องแทนที่ฟังก์ชัน Access ด้วยฟังก์ชัน TSQL ที่เทียบเท่ากันหากมีอยู่ ถ้าไม่มีฟังก์ชัน TSQL ที่สอดคล้องกัน คุณสามารถสร้าง คอลัมน์จากการคํานวณ ได้ (คํา TSQL ที่ใช้สําหรับคอลัมน์จากการคํานวณ) เพื่อทําสิ่งที่คุณต้องการ TSQL มีฟังก์ชันมากมายและเป็นประโยชน์ต่อคุณเพื่อดูว่ามีอะไรพร้อมใช้งานบ้าง สําหรับข้อมูลเพิ่มเติม ให้ดู ฟังก์ชันฐานข้อมูล SQL คืออะไร
ตารางต่อไปนี้แสดงฟังก์ชัน Access ที่มีฟังก์ชัน TSQL ที่ตรงกัน