다음을 통해 공유


MSSQLSERVER_4104

적용 대상: 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 열의 속성은 열 이름 앞에 테이블 이름이 접두사를 지정하는 것과 같은 방식으로 열 이름과 속성 이름 사이의 마침표 구분 기호(.)를 사용하여 참조되기 때문에 발생합니다. 다음 예제에서는 두 개의 테이블을 만들고 . a b 테이블에 b 는 CLR UDT dbo.myudt2 를 데이터 형식으로 사용하는 열a이 포함되어 있습니다. SELECT 문에는 여러 부분으로 구성된 식별자가 포함되어 있습니다 a.c2.

    CREATE TABLE a (c2 int);   
    GO  
    
    CREATE TABLE b (a dbo.myudt2);   
    GO  
    
    SELECT a.c2 FROM a, b;   
    

    UDT myudt2 에 명명된 c2속성이 없다고 가정하면 SQL Server는 식별자가 a.c2테이블의 열 또는 테이블 a 의 열 c2 a, 속성을 c2 b참조하는지 여부를 확인할 수 없습니다.

사용자 작업

  • 쿼리의 FROM 절에 지정된 테이블 이름 또는 별칭 이름과 열 접두사가 일치하도록 수정하십시오. FROM 절의 테이블 이름에 대한 별칭이 정의된 경우 해당 테이블과 연결된 열에 대한 한정자로만 별칭을 사용할 수 있습니다.

    테이블을 참조 HumanResources.Department 하는 위의 문은 다음과 같이 수정할 수 있습니다.

    SELECT Dept.Name FROM HumanResources.Department AS Dept;  
    GO  
    
    SELECT 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  
    

    위의 TableA SELECT 문은 다음과 같이 수정할 수 있습니다.

    SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;  
    

    또는

    SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;  
    
  • 식별자에 고유하고 명확하게 정의된 이름을 사용합니다. 이렇게 하면 코드를 보다 쉽게 읽고 유지 관리할 수 있으며 여러 엔터티를 모호하게 참조하는 위험을 최소화할 수 있습니다.

참고 항목

MSSQLSERVER_107
데이터베이스 식별자