ทำความเข้าใจกับข้อผิดพลาด “Invalid Column Name” ใน SQL
เมื่อทำงานกับ SQL Server และค้นหาข้อมูลจากเซิร์ฟเวอร์ SSAS ที่เชื่อมโยง คุณอาจพบข้อผิดพลาดที่ทำให้รู้สึกหงุดหงิด: “Invalid column name ‘Value’” ปัญหานี้มักเกิดขึ้นเมื่อพยายามกรองผลลัพธ์โดยใช้ชื่อแทนใน WHERE
clause ของคำสั่ง SQL หากบล็อกโพสต์นี้เราจะสำรวจปัญหานี้อย่างละเอียดและให้ทางแก้ง่าย ๆ เพื่อช่วยคุณในการแก้ไข
อธิบายปัญหา
ในคำสั่ง SQL เริ่มต้นของคุณ ทุกอย่างดูเหมือนจะทำงานได้อย่างถูกต้อง:
SELECT "Ugly OLAP name" as "Value"
FROM OpenQuery(OLAP, 'OLAP Query')
อย่างไรก็ตาม การเพิ่ม WHERE
clause เพื่อกรองค่าที่มากกว่าศูนย์ดังนี้:
WHERE "Value" > 0
จะทำให้เกิดข้อผิดพลาด:
Invalid column name ‘Value’
ข้อผิดพลาดนี้เกิดขึ้นเนื่องจาก ลำดับการประเมินผล ใน SQL Server ซึ่งแตกต่างจากลำดับที่คุณอาจเขียนคำสั่งนี้ การเข้าใจลำดับนี้เป็นสิ่งสำคัญเพื่อหลีกเลี่ยงข้อผิดพลาดเช่นนี้
ลำดับการประมวลผลคำสั่ง SQL
SQL Server จะประมวลผลคำสั่งในลำดับที่เฉพาะเจาะจงโดยไม่คำนึงถึงการจัดรูปแบบของมัน นี่คือลำดับการประมวลผล:
- FROM: กำหนดตารางหรือมุมมองที่ใช้เป็นแหล่งข้อมูล
- ON: เงื่อนไขการเชื่อม
- JOIN: รวมตารางเข้าด้วยกัน
- WHERE: กรองแถวตามเกณฑ์
- GROUP BY: จัดเรียงแถวเป็นกลุ่ม
- HAVING: กรองกลุ่ม
- SELECT: เลือกคอลัมน์ที่จะส่งกลับ
- ORDER BY: จัดเรียงชุดผลลัพธ์
ตามลำดับนี้ เอนจิน SQL จะประมวลผล WHERE
clause ก่อนที่จะประเมินบรรทัด SELECT
ซึ่งหมายความว่าชื่อแทน “Value” ยังไม่ถูกจดจำเมื่อมีการตรวจสอบเงื่อนไข
ทางแก้
เพื่อหลีกเลี่ยงข้อจำกัดนี้ คุณสามารถสร้าง inline view (หรือที่เรียกว่า ตารางที่ได้จากการรับข้อมูล) วิธีนี้ช่วยให้คุณสามารถห่อหุ้มคำสั่งต้นฉบับไว้ ทำให้ชื่อแทนถูกใช้เป็นชื่อคอลัมน์ที่ถูกต้องในเงื่อนไขถัดไป นี่คือวิธีที่คุณสามารถทำได้:
SELECT A.Value
FROM (
SELECT "Ugly OLAP name" as "Value"
FROM OpenQuery(OLAP, 'OLAP Query')
) AS A
WHERE A.Value > 0
อธิบายการแก้ไข
- การสร้าง Inline View: คำสั่ง
SELECT
ถูกห่อหุ้มในวงเล็บและมีชื่อแทน (ในกรณีนี้คือAS A
) มุมมองนี้จะถูกถือว่าเป็น “ตาราง” ใหม่ - การอ้างอิงชื่อแทน: ตอนนี้ เนื่องจาก
Value
เป็นคอลัมน์ที่ถูกต้องในบริบทของ inline view คุณสามารถใช้งานได้อย่างปลอดภัยในWHERE
clause ของคุณ
สรุป
การเข้าใจว่าการประมวลผลคำสั่งใน SQL Server ทำงานอย่างไรในระดับพื้นฐานสามารถช่วยประหยัดเวลาให้คุณเมื่อทำการแก้ไขข้อผิดพลาดเช่นข้อผิดพลาด “Invalid column name” โดยการใช้ inline view คุณจะสร้างโครงสร้างเชิงตรรกะที่ SQL รู้ว่าต้องอ้างอิงอะไรในระหว่างการประมวลผล WHERE
clause
หากคุณประสบปัญหาเดียวกันในขณะที่ทำงานกับคำสั่ง SQL จำไว้ว่าต้องพิจารณาลำดับการประมวลผลและใช้ inline views เมื่อต้องการเพื่อสร้างโครงสร้างคำสั่งที่สะอาดและมีประสิทธิภาพมากขึ้น
ตอนนี้คุณพร้อมที่จะจัดการคำสั่ง SQL ของคุณด้วยความมั่นใจ!