ทำความเข้าใจกับข้อผิดพลาด “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 จะประมวลผลคำสั่งในลำดับที่เฉพาะเจาะจงโดยไม่คำนึงถึงการจัดรูปแบบของมัน นี่คือลำดับการประมวลผล:

  1. FROM: กำหนดตารางหรือมุมมองที่ใช้เป็นแหล่งข้อมูล
  2. ON: เงื่อนไขการเชื่อม
  3. JOIN: รวมตารางเข้าด้วยกัน
  4. WHERE: กรองแถวตามเกณฑ์
  5. GROUP BY: จัดเรียงแถวเป็นกลุ่ม
  6. HAVING: กรองกลุ่ม
  7. SELECT: เลือกคอลัมน์ที่จะส่งกลับ
  8. 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 ของคุณด้วยความมั่นใจ!