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

나는 약간의 교착 상태에 빠졌습니다. 일부 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);도 열이 누락되었다고 생각하기 때문에 코드에서 실행할 때 실패합니다.

어떤 아이디어?



답변

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

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

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

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

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

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

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

[추가 참고 사항 수정]

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

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

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


답변

그냥 눌러 Ctrl+ Shift+ R볼 …

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


답변

테이블을 삭제 / 변경하기 전에 트랜잭션 및 SQL 문 내에서 이것을 실행하는 경우이 메시지를받을 수도 있습니다.


답변

결국 Microsoft SQL Server Management Studio를 종료하고 다시 시작했습니다. 그리고 그것은 나를 위해 그것을 고쳤습니다. 그러나 다른 경우에는 새 쿼리 창을 시작하는 것으로 충분했습니다.


답변

열과 이름이 같은 변수를 사용하는 경우 ‘@’변수 마커를 잊어 버린 것일 수 있습니다. INSERT 문에서는 열로 감지됩니다.


답변

똑같은 문제가있었습니다. 동일한 코드의 다른 부분에서 추가로 사용되는 임시 테이블의 일부 별칭 열 이름을 변경했습니다. 어떤 이유로 SQL Server Management Studio에서 캡처되지 않았으며 잘못된 열 이름에 대해 불평했습니다.

내가 간단히 한 것은 새 쿼리를 만들고 이전 쿼리의 SQL 코드를이 새 쿼리에 복사하여 붙여 넣은 다음 다시 실행하는 것입니다. 이것은 환경을 올바르게 새로 고치는 것처럼 보였습니다.


답변

제 경우에는 Microsoft SQL Sever Management Studio를 다시 시작하고 이것은 저에게 잘 작동합니다.