SQL Server รายงาน 'ชื่อคอลัมน์ไม่ถูกต้อง' แต่มีคอลัมน์อยู่และแบบสอบถามทำงานผ่านสตูดิโอการจัดการ


107

ฉันเจอทางตันนิดหน่อย ฉันมีแบบสอบถามที่สร้างขึ้นโดยC#รหัสบางอย่าง แบบสอบถามทำงานได้ดีMicrosoft SQL Server Management Studioเมื่อทำงานกับฐานข้อมูลเดียวกัน

อย่างไรก็ตามเมื่อรหัสของฉันพยายามเรียกใช้แบบสอบถามเดียวกันฉันได้รับข้อผิดพลาดเดียวกันเกี่ยวกับคอลัมน์ที่ไม่ถูกต้องและมีข้อยกเว้นเกิดขึ้น การสืบค้นทั้งหมดที่อ้างอิงคอลัมน์นี้ล้มเหลว

เพิ่งเพิ่มคอลัมน์ที่เป็นปัญหาในฐานข้อมูล Incident_Begin_Time_tsมันเป็นวันที่คอลัมน์ที่เรียกว่า

ตัวอย่างที่ล้มเหลวคือ:

select * from PerfDiag 
where Incident_Begin_Time_ts > '2010-01-01 00:00:00';

ข้อความค้นหาอื่น ๆ เช่นSelect MAX(Incident_Being_Time_ts);ล้มเหลวเมื่อรันในโค้ดเนื่องจากคิดว่าคอลัมน์หายไป

ความคิดใด ๆ ?


มันเป็นปัญหากับกรณีหรือไม่? บางที Management Studio อาจไม่สนใจเคสในขณะที่วิธีอื่นในการเข้าถึงฐานข้อมูลนั้นเข้มงวดกว่า
Oliver

1
คุณแน่ใจหรือไม่ว่าคุณกำลังจัดการกับฐานข้อมูลเดียวกันในโค้ดของคุณกับฐานข้อมูลใน Management Studio
rlb.usa

3
คุณแน่ใจหรือไม่ว่าชื่อคอลัมน์ที่คุณสร้างใน C # และชื่อคอลัมน์ที่คุณพยายามค้นหานั้นเหมือนกันทุกประการ ในคำถามของคุณคุณกำลังเขียน "Incident _ Begin _ Time_ts" สองครั้งและครั้งหนึ่ง "Incident _ Being _ Time_ts"
Christian Specht

1
@Oliver: case-sensitive ไม่ใช่ต่อการเชื่อมต่อ เป็นตัวเลือกเซิร์ฟเวอร์ฐานข้อมูล / sql
Nicholas Carey

คำตอบ:


65

ฉันสงสัยว่าคุณมีสองตารางที่มีชื่อเดียวกัน สคีมาหนึ่งเป็นเจ้าของโดยสคีมา 'dbo' ( dbo.PerfDiag) และอีกอันเป็นของสคีมาเริ่มต้นของบัญชีที่ใช้เชื่อมต่อกับ SQL Server (บางอย่างเช่นuserid.PerfDiag)

เมื่อคุณมีการอ้างอิงที่ไม่ถูกต้องไปยังออบเจ็กต์สคีมา (เช่นตาราง) - อันที่ไม่ผ่านการรับรองตามชื่อสคีมา - การอ้างอิงอ็อบเจ็กต์จะต้องได้รับการแก้ไข การแก้ปัญหาชื่อเกิดขึ้นโดยการค้นหาในลำดับต่อไปนี้สำหรับวัตถุประเภทที่เหมาะสม (ตาราง) ที่มีชื่อที่ระบุ ชื่อจะเปลี่ยนเป็นนัดแรก:

  • ภายใต้สคีมาเริ่มต้นของผู้ใช้
  • ภายใต้ schema 'dbo'

การอ้างอิงที่ไม่มีเงื่อนไขจะถูกผูกไว้กับการแข่งขันครั้งแรกในลำดับข้างต้น

ตามแนวทางปฏิบัติที่แนะนำโดยทั่วไปควรมีคุณสมบัติในการอ้างอิงถึงวัตถุสคีมาเสมอด้วยเหตุผลด้านประสิทธิภาพ:

  • การอ้างอิงที่ไม่ตรงตามเงื่อนไขอาจทำให้แผนการดำเนินการแคชสำหรับกระบวนงานหรือคิวรีที่เก็บไว้เป็นโมฆะเนื่องจากสคีมาที่การอ้างอิงถูกผูกไว้อาจเปลี่ยนแปลงไปขึ้นอยู่กับข้อมูลประจำตัวที่เรียกใช้กระบวนงานหรือแบบสอบถามที่เก็บไว้ ส่งผลให้มีการคอมไพล์คิวรี / โพรซีเดอร์ที่จัดเก็บใหม่ซึ่งเป็นผลการดำเนินงาน การคอมไพล์ซ้ำทำให้การล็อกการคอมไพล์ถูกนำออกไปปิดกั้นไม่ให้ผู้อื่นเข้าถึงทรัพยากรที่จำเป็น

  • การแก้ไขชื่อทำให้การดำเนินการค้นหาช้าลงเนื่องจากต้องทำการโพรบสองตัวเพื่อแก้ไขเป็นเวอร์ชันที่เป็นไปได้ของอ็อบเจ็กต์ (ซึ่งเป็นของ 'dbo') นี่เป็นกรณีปกติ ครั้งเดียวที่โพรบเดียวจะแก้ไขชื่อคือถ้าผู้ใช้ปัจจุบันเป็นเจ้าของออบเจ็กต์ของชื่อและประเภทที่ระบุ

[แก้ไขเพื่อทราบเพิ่มเติม]

ความเป็นไปได้อื่น ๆ ได้แก่ (ไม่เรียงตามลำดับ):

  • คุณไม่ได้เชื่อมต่อกับฐานข้อมูลที่คุณคิดว่าคุณเป็น
  • คุณไม่ได้เชื่อมต่อกับอินสแตนซ์ SQL Server ที่คุณคิดว่าเป็น

ตรวจสอบสตริงการเชื่อมต่อของคุณอีกครั้งและตรวจสอบให้แน่ใจว่าระบุชื่ออินสแตนซ์ SQL Server และชื่อฐานข้อมูลอย่างชัดเจน


4
+1 ฉันใช้ sql profiler เพื่อติดตามปัญหาประเภทนี้ ทุกครั้งที่คุณจัดการกับ dynamic sql จากแอพพลิเคชั่นอื่นจับคิวรีด้วยการติดตามคัดลอกและวางลงในหน้าต่างแบบสอบถามใหม่คลิกดำเนินการเพื่อดูว่ามีอะไรผิดปกติ นอกจากนี้ยังจะตรวจสอบว่าคุณกำลังเชื่อมต่อกับอินสแตนซ์และฐานข้อมูลที่ถูกต้องตามที่แนะนำข้างต้น
brian

2
... นอกประเด็นเล็กน้อย แต่ถ้าคุณใช้ profiler เพื่อทำให้เกิดปัญหาด้านประสิทธิภาพอย่าลืมใส่ตัวเลือกชุดทั้งหมดโดยเฉพาะ ARITHABORT เพื่อทำแบบสอบถามซ้ำอย่างแท้จริง (และเป็นแผนแคช)
Nick.McD mermaid

ขั้นแรกให้ลองใช้ Ctrl + Shift + R เพื่อโหลดแคชซ้ำ แย่ที่สุดคุณเสียเวลาเพียงไม่กี่วินาที
radbyx

270

เพียงแค่กดCtrl+ Shift+ Rและดู ...

ใน SQL Server Management Studio Ctrl + Shift + R จะรีเฟรชแคชภายในเครื่อง


ทำไมคุณถึงคิดว่าการทำแบบนั้นจะเป็นประโยชน์
Amicable

7
ใน SQL Server Management Studio Ctrl + Shift + R จะรีเฟรชแคช Intellisense สิ่งนี้ทำให้ Management Studio หยุดบ่นว่าคอลัมน์ที่ฉันเพิ่มไม่ถูกต้อง แต่ฉันคิดว่านั่นเป็นปลาเฮอริ่งแดง (ฉันยังคงมีปัญหาเช่นเดียวกับโปสเตอร์ต้นฉบับเมื่อเข้าถึงคอลัมน์ใหม่เหล่านี้จากรหัส)
Giles

2
ดูเหมือนทุกครั้งที่ฉัน Add-Migration จากนั้น Update Database ฉันต้องทำสิ่งนี้ มิฉะนั้นฉันเข้าใจว่าเป็นชื่อคอลัมน์ที่ไม่ถูกต้องใน MS SQL Server ได้ผล! ขอบคุณมาก.
BriOnH

1
ดูเหมือนว่าคุณอาจต้องทำสิ่งนี้ทุกครั้งที่สร้างตารางหรืออะไรก็ตามในประเภทนั้น
Sonny Childs

1
ข้างต้นนี้เป็นวิธีแก้ปัญหาของฉันเมื่อมีสิ่งแปลก ๆ เกิดขึ้น ในกรณีนี้ไม่สามารถแก้ปัญหาได้ การรีสตาร์ท SQL Studio เป็นเคล็ดลับ
Dan Mehlqvist

9

หากคุณกำลังเรียกใช้สิ่งนี้ภายในธุรกรรมและคำสั่ง SQL ก่อนที่สิ่งนี้จะลดลง / เปลี่ยนแปลงตารางคุณจะได้รับข้อความนี้


1
+1. ฉันแก้ไขตารางโดยเพิ่มคอลัมน์ใหม่และได้รับข้อผิดพลาดนี้ในคำสั่งถัดไปที่อ้างถึงคอลัมน์ใหม่ ฉันเอาชนะสิ่งนี้โดยดำเนินการคำสั่งจนถึงการเปลี่ยนแปลงตารางในครั้งเดียวจากนั้นส่วนที่เหลือในอีกอันหนึ่ง ไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด แต่ทำให้ฉันถูกปลดบล็อก :)
Prasad Korhale

3

ในที่สุดฉันก็ปิดเครื่องและรีสตาร์ท Microsoft SQL Server Management Studio; และแก้ไขให้ฉัน แต่ในบางครั้งการเริ่มต้นหน้าต่างการสืบค้นใหม่ก็เพียงพอแล้ว


2

หากคุณใช้ตัวแปรที่มีชื่อเดียวกับคอลัมน์ของคุณอาจเป็นไปได้ว่าคุณลืมเครื่องหมายตัวแปร "@" ในคำสั่ง INSERT จะตรวจพบเป็นคอลัมน์


2

เพิ่งมีปัญหาเดียวกันแน่นอน ฉันเปลี่ยนชื่อคอลัมน์นามแฝงบางคอลัมน์ในตารางชั่วคราวซึ่งส่วนอื่นของโค้ดเดียวกันใช้เพิ่มเติม ด้วยเหตุผลบางประการ SQL Server Management Studio ไม่ได้บันทึกและบ่นเกี่ยวกับชื่อคอลัมน์ที่ไม่ถูกต้อง

สิ่งที่ฉันทำคือสร้างแบบสอบถามใหม่คัดลอกวางรหัส SQL จากแบบสอบถามเก่าไปยังแบบสอบถามใหม่นี้และเรียกใช้อีกครั้ง สิ่งนี้ดูเหมือนจะรีเฟรชสภาพแวดล้อมอย่างถูกต้อง


1

ในกรณีของฉันฉันรีสตาร์ท Microsoft SQL Sever Management Studio และสิ่งนี้ใช้ได้ดีสำหรับฉัน


0

ในกรณีของฉันฉันพยายามรับค่าจาก ResultSet ที่ไม่ถูกต้องเมื่อสอบถามคำสั่ง SQL หลายคำสั่ง


0

ในกรณีของฉันดูเหมือนว่าปัญหาจะเป็นปัญหาการแคชแปลก ๆ วิธีแก้ปัญหาข้างต้นไม่ได้ผล

หากโค้ดของคุณใช้งานได้ดีและคุณได้เพิ่มคอลัมน์ลงในตารางของคุณและทำให้เกิดข้อผิดพลาด 'ชื่อคอลัมน์ที่ไม่ถูกต้อง' และวิธีแก้ไขปัญหาข้างต้นไม่ได้ผลให้ลองทำดังนี้: ขั้นแรกให้รันเฉพาะส่วนของโค้ดเพื่อสร้างการแก้ไขนั้น ตารางแล้วเรียกใช้รหัสทั้งหมด


0

รวมคำตอบนี้เนื่องจากนี่เป็นผลลัพธ์อันดับต้น ๆ สำหรับ "ชื่อคอลัมน์ที่ไม่ถูกต้อง sql" ใน google และฉันไม่เห็นคำตอบนี้ที่นี่ ในกรณีของฉันฉันได้รับชื่อคอลัมน์ไม่ถูกต้อง Id1 เนื่องจากฉันใช้รหัสผิดในคำสั่ง. HasForeignKey ในรหัส C # ของ Entity Framework ของฉัน เมื่อฉันเปลี่ยนให้ตรงกับ id ของวัตถุ. HasOne () ข้อผิดพลาดก็หายไป


0

ฉันได้รับข้อผิดพลาดนี้เมื่อเรียกใช้ฟังก์ชันสเกลาร์โดยใช้ค่าตาราง แต่คำสั่ง Select ในฟังก์ชันสเกลาร์ของฉัน RETURN ส่วนคำสั่ง "FROM table" หายไป : facepalms:


0

นอกจากนี้ยังเกิดขึ้นเมื่อคุณลืมเปลี่ยน ConnectionString และถามตารางที่ไม่มีความคิดเกี่ยวกับการเปลี่ยนแปลงที่คุณทำในเครื่อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.