적용 대상: SQL Server
세부 정보
| attribute | 값 |
|---|---|
| 제품 이름 | SQL Server |
| 이벤트 ID | 4104 |
| 이벤트 원본 | MSSQLSERVER |
| 구성 요소 | SQLEngine |
| 심볼 이름 | ALG_MULTI_ID_BAD |
| 메시지 텍스트 | 다중 파트 식별자 "%.*ls"을(를) 바인딩할 수 없습니다. |
설명
SQL Server의 엔터티 이름을 식별 자라고 합니다. 예를 들어 쿼리에서 열 및 테이블 이름을 지정하여 엔터티를 참조할 때마다 식별자를 사용합니다. 다중 파트 식별자에는 식별자에 대한 접두사로 하나 이상의 한정자가 포함됩니다. 예를 들어 테이블 식별자에는 테이블이 포함된 데이터베이스 이름 및 스키마 이름과 같은 한정자가 접두사로 지정되거나 열 식별자에 테이블 이름 또는 테이블 별칭과 같은 한정자가 접두사로 추가될 수 있습니다.
오류 4104는 지정된 여러 부분으로 구성된 식별자가 기존 엔터티로 매핑될 수 없음을 나타냅니다. 이 오류는 다음과 같은 경우에 반환될 수 있습니다.
열 이름의 접두사로 제공된 한정자는 쿼리에 사용되는 테이블 또는 별칭 이름과 일치하지 않습니다.
예를 들어 다음 문은 테이블 별칭(
Dept)을 열 접두사로 사용하지만 FROM 절에서는 테이블 별칭이 참조되지 않습니다.SELECT Dept.Name FROM HumanResources.Department;다음 문에서는 여러 부분으로 구성된 열 식별자
TableB.KeyCol이 WHERE 절에 두 테이블 간 JOIN 조건의 일부로 지정되어 있지만TableB가 쿼리에서 명시적으로 참조되지 않습니다.DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;테이블의 별칭 이름은 FROM 절에 제공되지만 열에 제공된 한정자는 테이블 이름입니다. 예를 들어 다음 문은 테이블 이름을
Department열 접두사로 사용합니다. 그러나 테이블에는 FROM 절에서 참조되는 별칭(Dept)이 있습니다.SELECT Department.Name FROM HumanResources.Department AS Dept;별칭을 사용하는 경우 테이블 이름은 문의 다른 위치에서 사용할 수 없습니다.
SQL Server는 다중 파트 식별자가 테이블 접두사로 접두사로 지정된 열을 참조하는지 또는 열 앞에 접두사로 지정된 CLR UDT(사용자 정의 데이터 형식)의 속성을 참조하는지 확인할 수 없습니다. UDT 열의 속성은 열 이름 앞에 테이블 이름이 접두사를 지정하는 것과 같은 방식으로 열 이름과 속성 이름 사이의 마침표 구분 기호(.)를 사용하여 참조되기 때문에 발생합니다. 다음 예제에서는 두 개의 테이블을 만들고 .
ab테이블에b는 CLR UDTdbo.myudt2를 데이터 형식으로 사용하는 열a이 포함되어 있습니다. SELECT 문에는 여러 부분으로 구성된 식별자가 포함되어 있습니다a.c2.CREATE TABLE a (c2 int); GOCREATE TABLE b (a dbo.myudt2); GOSELECT a.c2 FROM a, b;UDT
myudt2에 명명된c2속성이 없다고 가정하면 SQL Server는 식별자가a.c2테이블의 열 또는 테이블a의 열c2a, 속성을c2b참조하는지 여부를 확인할 수 없습니다.
사용자 작업
쿼리의 FROM 절에 지정된 테이블 이름 또는 별칭 이름과 열 접두사가 일치하도록 수정하십시오. FROM 절의 테이블 이름에 대한 별칭이 정의된 경우 해당 테이블과 연결된 열에 대한 한정자로만 별칭을 사용할 수 있습니다.
테이블을 참조
HumanResources.Department하는 위의 문은 다음과 같이 수정할 수 있습니다.SELECT Dept.Name FROM HumanResources.Department AS Dept; GOSELECT Department.Name FROM HumanResources.Department; GO모든 테이블이 쿼리에 지정되고 테이블 간의 JOIN 조건이 올바르게 지정되었는지 확인합니다. 위의 DELETE 문은 다음과 같이 수정할 수 있습니다.
DELETE FROM dbo.TableA WHERE TableA.KeyCol = (SELECT TableB.KeyCol FROM TableB WHERE TableA.KeyCol = TableB.KeyCol); GO위의
TableASELECT 문은 다음과 같이 수정할 수 있습니다.SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;또는
SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;식별자에 고유하고 명확하게 정의된 이름을 사용합니다. 이렇게 하면 코드를 보다 쉽게 읽고 유지 관리할 수 있으며 여러 엔터티를 모호하게 참조하는 위험을 최소화할 수 있습니다.