SQL Server가 '잘못된 열 이름'을보고하지만 열이 있고 쿼리가 Management Studio를 통해 작동합니다.


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는 대소 문자를 신경 쓰지 않는 반면 데이터베이스에 액세스하는 다른 방법은 더 엄격합니다.
올리버

1
코드에서 Management Studio의 데이터베이스와 동일한 데이터베이스를 처리하고 있습니까?
rlb.usa

3
C #에서 만든 열 이름과 쿼리하려는 열 이름이 정확히 일치합니까? 귀하의 질문에 두 번 '사건 _ 시작 _ Time_ts'와 한 번 '사고 _ 존재 _ Time_ts'를 쓰고 있습니다.
Christian Specht

1
@Oliver : 대소 문자 구분은 연결 단위가 아닙니다. 데이터베이스 / SQL 서버 옵션입니다.
Nicholas Carey

답변:


65

이름이 같은 테이블이 두 개있는 것 같습니다. 하나는 스키마 'dbo'( dbo.PerfDiag)가 소유하고 다른 하나는 SQL Server에 연결하는 데 사용되는 계정의 기본 스키마 (예 :) 가 소유합니다 userid.PerfDiag.

스키마 객체 (예 : 테이블)에 대한 규정되지 않은 참조 (스키마 이름으로 규정되지 않은 참조)가있는 경우 객체 참조를 확인해야합니다. 이름 확인은 지정된 이름을 가진 적절한 유형 (테이블)의 개체를 다음 순서로 검색하여 발생합니다. 이름은 첫 번째 일치로 확인됩니다.

  • 사용자의 기본 스키마 아래.
  • 스키마 'dbo'에서.

규정되지 않은 참조는 위 순서에서 첫 번째 일치 항목에 바인딩됩니다.

일반적으로 권장되는 방법 으로 성능상의 이유로 항상 스키마 개체에 대한 참조를 한정 해야합니다 .

  • 정규화되지 않은 참조는 저장 프로 시저 또는 쿼리를 실행하는 자격 증명에 따라 참조가 바인딩 된 스키마가 변경 될 수 있으므로 저장 프로 시저 또는 쿼리에 대한 캐시 된 실행 계획을 무효화 할 수 있습니다. 이로 인해 쿼리 / 저장 프로 시저의 재 컴파일이 발생하여 성능이 저하됩니다. 재 컴파일은 컴파일 잠금을 해제하여 다른 사용자가 필요한 리소스에 액세스하는 것을 차단합니다.

  • 이름 확인은 'dbo'가 소유 한 개체의 가능한 버전을 확인하기 위해 두 개의 프로브를 만들어야하므로 쿼리 실행 속도가 느려집니다. 이것은 일반적인 경우입니다. 단일 프로브가 이름을 확인하는 유일한 경우는 현재 사용자가 지정된 이름 및 유형의 개체를 소유 한 경우입니다.

[추가 참고 사항 수정]

다른 가능성은 다음과 같습니다 (특정 순서 없음).

  • 자신이 생각하는 데이터베이스에 연결되어 있지 않습니다.
  • 자신이 생각하는 SQL Server 인스턴스에 연결되어 있지 않습니다.

연결 문자열을 다시 확인하고 SQL Server 인스턴스 이름과 데이터베이스 이름을 명시 적으로 지정했는지 확인합니다.


4
+1 SQL 프로파일 러를 사용하여 이러한 유형의 문제를 추적합니다. 다른 응용 프로그램에서 동적 SQL을 처리 할 때마다 추적으로 쿼리를 캡처하고 새 쿼리 창에 복사하여 붙여넣고 실행을 클릭하여 무엇이 잘못되었는지 확인합니다. 또한 위에서 제안한대로 올바른 인스턴스 및 db에 연결하고 있는지 확인합니다.
brian

2
... 약간의 주제에서 벗어 났지만 성능 문제를 재현하기 위해 프로파일 러를 사용하는 경우 모든 세트 옵션 , 특히 쿼리를 진정으로 복제하기 위해 ARITHABORT (그리고 캐시 된 계획)를 포함하는 것을
잊지 마십시오.

먼저 Ctrl + Shift + R을 눌러 캐시를 다시로드하십시오. 최악의 경우 몇 초만 낭비합니다.
radbyx

267

그냥 눌러 Ctrl+ Shift+ R볼 ...

SQL Server Management Studio에서 Ctrl + Shift + R은 로컬 캐시를 새로 고칩니다.


그렇게하는 것이 왜 도움이 될 것이라고 생각합니까?
Amicable 2014

7
SQL Server Management Studio에서 Ctrl + Shift + R은 Intellisense 캐시를 새로 고칩니다. 이로 인해 Management Studio가 내가 추가 한 열이 유효하지 않다고 불평하는 것을 막았지만, 이것이 붉은 청어라고 생각합니다 (코드에서 이러한 새 열에 액세스 할 때 원본 포스터와 같은 문제가 여전히 있습니다).
Giles

2
마이그레이션을 추가하고 데이터베이스를 업데이트 할 때마다이 작업을 수행해야합니다. 그렇지 않으면 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

제 경우에는 여러 SQL 문을 쿼리 할 때 잘못된 ResultSet에서 값을 가져 오려고했습니다.


0

제 경우에는 문제가 이상한 캐싱 문제인 것 같습니다. 위의 솔루션이 작동하지 않았습니다.

코드가 제대로 작동하고 테이블 중 하나에 열을 추가했는데 '잘못된 열 이름'오류가 발생하고 위의 솔루션이 작동하지 않는 경우 다음을 시도하십시오. 먼저 수정 된 코드를 만들기위한 코드 섹션 만 실행합니다. 테이블 전체 코드를 실행하십시오.


0

이 답변이 Google에서 "잘못된 열 이름 sql"에 대한 상위 결과 였기 때문에 여기에이 답변이 표시되지 않았습니다. 제 경우에는 Entity Framework C # 코드의 .HasForeignKey 문에 잘못된 ID를 사용했기 때문에 잘못된 열 이름, Id1이 발생했습니다. .HasOne () 객체의 ID와 일치하도록 변경하면 오류가 사라졌습니다.


0

테이블 값을 사용하여 스칼라 함수를 실행할 때이 오류가 발생했지만 스칼라 함수 RETURN 절의 Select 문에 "FROM 테이블"부분이 없습니다. : 페이스 팜 :


0

또한 ConnectionString을 변경하는 것을 잊고 로컬에서 변경 한 내용을 전혀 모르는 테이블에 문의 할 때도 발생합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.